Новости и статьи

Среда разработки встроенных систем или дистрибутивов на основе GNU/Linux. Здесь вы можете найти новости проекта, статьи и заметки, касающиеся разработки дистрибутива Radix cross Linux.

Git cheat sheets

2 июня 2016 г.

Краткое описание основных команд для работы с Git репозиториями. Здесь дан минимально необходимый перечень команд, который позволит начать работу с репозиториями сервера Radix.Linux.

tags

Git

Более полную информацию о Git можно найти, например в книге Pro Git (на русском языке, эту книгу можно полистать здесь: Pro Git).

Create a bare repository

Чистые репозитории используются для представления удаленного доступа. В таких репозиториях не ведется разработка непосредственно, а код в них доставляется с помощью команды git push.

Создание чистого репозитория рассмотрим на примере /u3/scm/git/IRAM-flasher.git репозитория из обычного.

Прежде всего создадим обычный репозиторий на сервере в каталоге /u3/scm/git/IRAM-flasher:

$ mkdir -p /u3/scm/git/IRAM-flasher

Скопируем в каталог /u3/scm/git/IRAM-flasher дерево исходников и инициализируем его как git-репозиторий:

$ cd /u3/scm/git/IRAM-flasher
$ git init
$ git config --global user.name "kx"
$ git config --global user.email kx@radix.pro
$ touch .gitignore
$ git add -A .

Файл .gitignore мы создали для того, чтобы указать файлы, которые мы не будем учитывать под версионным контролем. Например, мы не будем отслеживать изменения объектных файлов и библиотек. Для этого добавим следующий шаблон в файл .gitignore

*.[oa]

и обновим индекс:

$ git update-index --assume-unchanged .gitignore

Сделаем первый комит кода в новый репозиторий:

$ git commit -m "Initial commit"

Теперь нам остается только создать чистый репозиторий на основе имеющегося:

$ cd ..
$ git clone --bare IRAM-flasher IRAM-flasher.git
Initialized empty Git repository in /u3/scm/git/IRAM-flasher.git/

Удалить за ненадобностью обычный репозиторий:

$ rm -rf IRAM-flasher/

И отдать права пользователю git (не забыв о людях, которые входят в группу git):

# chown -R git:git IRAM-flasher.git
# chmod -R g+w IRAM-flasher.git

Хорошим тоном является задание краткого описания репозитория и его владельца для WEB-интерфейсов, таких как gitweb и cGit:

$ cd /u3/scm/git/IRAM-flasher.git/
$ cat "Short description of your repository" > description
$ vi config

. . .

[gitweb]
       owner = Andrey V.Kosteltsev

Dealing with Repository from Remote HOST

Клонировать репозиторий можно с помощью команды git clone:

$ git clone git@radix.pro:/u3/scm/git/IRAM-flasher.git IRAM-flasher
Cloning into 'IRAM-flasher'...
remote: Counting objects: 22, done.
remote: Compressing objects: 100% (21/21), done.
Receiving objects: 100% (22/22), 23.77 KiB, done.
remote: Total 22 (delta 2), reused 0 (delta 0)
Resolving deltas: 100% (2/2), done.

Прежде чем начать работать с репозиториями, обязательно идентифицируйте себя установив переменные user.name и user.email:

$ cd IRAM-flasher
$ git config --global user.name "kx"
$ git config --global user.email kx@radix.pro

После того, как вы внесли изменения в код, можно воспользоваться командой git commit:

$ git commit -a -m "Added .text.startup section"
[master da9d480] Added .text.startup section
 1 file changed, 1 insertion(+)

Для доставки изменений, сделанных вами в локальном репозитории, в origin репозиторий, служит команда git push:

$ git push
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 355 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)
To git@radix.pro:/u3/scm/git/IRAM-flasher.git
   f3bfe3f..da9d480  master -> master

Следует помнить, что теги не доставляются в origin репозиторий неявно с помощью команды git push. Для того, чтобы доставить тег в origin репозиторий, необходимо задать параметры команды явно:

$ git push origin 0.0.1
Counting objects: 1, done.
Writing objects: 100% (1/1), 184 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@radix.pro:/u3/scm/git/IRAM-flasher.git
 * [new tag]         IRAM-flasher-0.0.1 -> IRAM-flasher-0.0.1

Для получения обновлений, сделанных в origin репозитории, служит команда git pull. Например, получить обновления, сделанные на master ветке, можно воспользоваться следующей командой:

$ git pull origin master
From /u3/scm/git/sources
 * branch            master     -> FETCH_HEAD
Updating c4eea19..8043f46
Fast-forward
 Makefile                 |  1 +
 uClinux/elf2flt/Makefile | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 uClinux/elf2flt/Makefile

Git tags

Git использует два основных типа меток: легковесные и аннотированные. Легковесная метка – это что-то весьма похожее на ветку, которая не меняется – это просто указатель на определённый коммит. А вот аннотированные метки хранятся в базе данных Git как полноценные объекты. Они имеют контрольную сумму, содержат имя поставившего метку, e-mail и дату, имеют комментарий и могут быть подписаны и проверены с помощью GNU Privacy Guard (GPG). Обычно рекомендуется создавать аннотированные метки, чтобы иметь всю перечисленную информацию; но если вы хотите сделать временную метку или по какой-то причине не хотите сохранять остальную информацию, то для этого годятся и легковесные метки.

Аннотированные метки

Создание аннотированной метки в Git выполняется легко. Самый простой способ это задать управление  -a при выполнении команды tag:

$ git tag -a 0.0.1 -m 'Created tag for release (version 0.0.1)'

Для того, чтобы доставить тег в origin репозиторий, необходимо задать параметры команды явно (см. Dealing with Repository from Remote HOST):

$ git push origin 0.0.1
Counting objects: 1, done.
Writing objects: 100% (1/1), 184 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@radix.pro:/u3/scm/git/IRAM-flasher.git
 * [new tag]         IRAM-flasher-0.0.1 -> IRAM-flasher-0.0.1

Чтобы удалить метку, например, с именем 0.0.1, надо выполнить следующие команды:

$ git tag -d 0.0.1
$ git push origin :refs/tags/0.0.1

List tags and branches

Просмотр имеющихся меток (tag) в Git делается просто. Достаточно набрать git tag:

$ git tag
IRAM-flasher-0.0.1

Аналогичным образом можно посмотреть список всех веток в репозитории:

$ git branch
* master

Repository Mirror

With sufficiently recent git (>=1.6.0):

In the below examples, git_user and project.git should be modified for your GitHub project.

Set up a (bare) mirror of the source repository

$ git clone --mirror git://gitorious.org/linux-davinci/linux-davinci.git

to fetch the changes

$ cd linux-davinci.git
$ git fetch -q --all

make fetching automatic by installing a crontask

export EDITOR=vim
crontab -e
*/5 * * * * cd /path/to/linux-davinci.git && git fetch -q --all
:wq

or

 sudo vi /etc/cron.d/sync_git_repos
 */5 * * * * cd /path/to/linux-davinci.git && git fetch -q --all

*/5 in the last line defines the minute at which the synchronization takes place, for example, */2 would cause the sychronization to take place every two minutes. */5 causes the synchronization to take place on minutes divisible by 5 (5, 10, 15, etc.)

Light Weight Clone

The command git clone has a  --depth flag:

$ git clone --depth <depth> . . . 

Create a shallow clone with a history truncated to the specified number of revisions. A shallow repository has a number of limitations (you cannot clone or fetch from it, nor push from nor into it), but is adequate if you are only interested in the recent history of a large project with a long history, and would want "to send in fixes as patches".

Change last commit message

To change the last incorrect commit message in the cloned repository you can make use following command:

$ git commit --amend -m "some other message"

But pushing this commit to the remote repository is not trivial and you commit will be rejected.

$ git push
To git@radix.pro:/u3/scm/git/sources.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@radix.pro:/u3/scm/git/sources.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

If you work alone on the master branch and your commit doesn't affect eachother then you can use following command:

$ git push origin +master:master
Counting objects: 70, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (28/28), done.
Writing objects: 100% (38/38), 3.58 KiB, done.
Total 38 (delta 15), reused 0 (delta 0)
To git@radix.pro:/u3/scm/git/sources.git
 + dc81971...fa4001b master -> master (forced update)

Information about changing older commit massages you can find at Changing a commit message page.