Git: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показана 61 промежуточная версия 19 участников)
Строка 1: Строка 1:
[[Category:Devel]]
{{DISPLAYTITLE:git}}
{{Stub}}
{{Stub}}
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/git}}
== Руководства ==


== Всё о GIT, со слов ldv ==
* [[Краткое руководство по сборке с gear]]
* [[Git.alt|Руководство по git.alt]]
* [https://git.altlinux.org Основная страница git.alt]
* [[Git.alt/Справочник | Справочник по git.alt (rus)]]


* [[Git.alt|Руководство по git.alt]] (в процессе)
== Всё о GIT, со слов ldv@ ==


''Здесь на самом деле не про git per se, а про git применительно к ALT Linux и git.alt; в качестве введения в git см., например, [http://www.kernel.org/pub/software/scm/git/docs/everyday.html Everyday GIT].''
На самом деле не про git как таковой, а про git применительно к ALT Linux и git.alt; некое подобие QuickStart по git@ALT для присматривающихся участников team — [[git/start|здесь]].


''Некое подобие QuickStart по git@ALT для присматривающихся участников team -- [[git/start|здесь]].''
В качестве введения в git смотрите [http://www.ibm.com/developerworks/ru/library/l-git/index.html?S_TACT=105AGX99&S_CMP=GR01 Управление исходным кодом с помощью Git] (на русском языке) и [http://www.kernel.org/pub/software/scm/git/docs/everyday.html Everyday GIT] (на английском языке).


<div style="display: inline; color: red;">NB: эту страницу (а также [[gear|gear]], [[gear/kis|gear/kis]], [[gear/geartags|gear/geartags]], [[gear/ImportUpstreamVBranch|gear/ImportUpstreamVBranch]], [[gear/ImportSeparateUpstream|gear/ImportSeparateUpstream]], [[git/recommit|git/recommit]], [[git/gitnotes|git/gitnotes]], [[git/gitincompact|git/gitincompact]], [[git/SomeDestReposViaBranches|git/SomeDestReposViaBranches]], [[git/MergingBranches|git/MergingBranches]], [[git/BranchInGit|git/BranchInGit]]) надо творчески раскромсать на:</div>
'''Примечание:''' все примеры команд, указываемых через дефис (например, <tt>git-clone</tt>) на последних версиях Git следует применять без дефиса, заменив его пробелом: <tt>git clone</tt>.
 
NB: эту страницу (а также [[gear]], [[git/start2]], [[gear/geartags]], [[gear/ImportUpstreamVBranch]], [[gear/ImportSeparateUpstream]], [[git/recommit]], [[git/gitnotes]], [[git/SomeDestReposViaBranches]], [[git/MergingBranches]], [[git/BranchInGit]]) надо творчески раскромсать на:
* Введение в git + ссылки
* Введение в git + ссылки
* Руководство по git.alt
* [[Git.alt|Руководство по git.alt]]
* Ведение пакетов при помощи gear
* [[Руководство по gear]]
* Справочник по git.alt
* [[Справочник по git.alt]]
* Справочник по gear
* Справочник по gear


__TOC__
__TOC__


=== GEAR ===
=== GEAR ===


В апреле 2007 года идея хранить исходный код пакетов в git-репозитории была реализована с помощью утилиты, которая 27-го апреля получила имя [[gear|gear]].  Напомню вкратце:
В апреле 2006 года идея хранить исходный код пакетов в git-репозитории была реализована с помощью утилиты, которая 27-го апреля получила имя [[gear|gear]].  Напомню вкратце:


Основной смысл хранения исходного кода пакетов в git-репозитории заключается в более эффективной и удобной совместной разработке, а также минимизации трафика и места на диске для хранения архива репозитория за длительный срок.  Идея <tt>gear</tt> заключается в том, чтобы с помощью одного файла с простыми правилами (для обработки которых достаточно <tt>git</tt>+<tt>sed</tt>) можно было собирать пакеты из произвольно устроенного git-репозитория, по аналогии с <tt>hasher</tt>, который был задуман как средство собирать пакеты из произвольных srpm-пакетов.
Основной смысл хранения исходного кода пакетов в git-репозитории заключается в более эффективной и удобной совместной разработке, а также минимизации трафика и места на диске для хранения архива репозитория за длительный срок.  Идея <tt>gear</tt> заключается в том, чтобы с помощью одного файла с простыми правилами (для обработки которых достаточно <tt>git</tt>+<tt>sed</tt>) можно было собирать пакеты из произвольно устроенного git-репозитория, по аналогии с [[hasher]], который был задуман как средство собирать пакеты из произвольных srpm-пакетов.


За время, прошедшее с конца апреля, многие из вас успели освоиться с <tt>gear</tt>, появилась базовая документация, семейство вспомогательных утилит и опыт эксплуатации.  Поэтому весьма вероятно, что те из вас, кому только предстоит осваивать gear, пройдут этот путь гораздо легче и быстрее чем я.  :) Например, одна только утилита <tt>gear-srpmimport</tt> позволяет на начальном этапе вообще не интересоваться синтаксисом файла <tt>.gear-rules</tt>.
За время, прошедшее с конца апреля, многие из вас успели освоиться с <tt>gear</tt>, появилась базовая документация, семейство вспомогательных утилит и опыт эксплуатации.  Поэтому весьма вероятно, что те из вас, кому только предстоит осваивать gear, пройдут этот путь гораздо легче и быстрее чем я.  :) Например, одна только утилита <tt>gear-srpmimport</tt> позволяет на начальном этапе вообще не интересоваться синтаксисом файла <tt>.gear-rules</tt>.
Строка 33: Строка 37:
=== Структура репозитория ===
=== Структура репозитория ===


Как уже было сказано, <tt>gear</tt> не накладывает ограничений на внутреннюю организацию git-репозитория (не считая файла с правилами). Тем не менее, у меня есть несколько соображений о том, как более эффективно и удобно организовывать git-репозитории, предназначенные для хранения пакетов:
Как уже было сказано, <tt>gear</tt> не накладывает ограничений на внутреннюю организацию git-репозитория (не считая файла с правилами). Тем не менее, у меня есть несколько соображений о том, как более эффективно и удобно организовывать git-репозитории, предназначенные для хранения пакетов:
 
* Одна сущность - один репозиторий.
::Не стоит помещать в один репозиторий несколько разных пакетов, за исключением случаев, когда у этих пакетов есть общий пакет-предок.  Соблюдение этого правила облегчает совместную работу над пакетом, поскольку не перегруженный репозиторий легче клонировать и в целом инструментарий git больше подходит для работы с такими репозиториями.
** '''Отрицательная сторона''': несколько сложнее делать «push» и «pull» в случае, когда репозиториев, которые надо обработать, много.  Впрочем, push/pull в цикле выручает.


* Одна сущность — один репозиторий.
*: Не стоит помещать в один репозиторий несколько разных пакетов, за исключением случаев, когда у этих пакетов есть общий пакет-предок. Соблюдение этого правила облегчает совместную работу над пакетом, поскольку не перегруженный репозиторий легче клонировать и в целом инструментарий git больше подходит для работы с такими репозиториями.
*:: '''Отрицательная сторона''': несколько сложнее делать «push» и «pull» в случае, когда репозиториев, которые надо обработать, много. Впрочем, push/pull в цикле выручает.
* Несжатый исходный код.
* Несжатый исходный код.
::Сжатый разными архиваторами исходный код (как правило это tarball'ы) лучше хранить в git-репозитории в несжатом виде. Изменение файлов, которые помещены в репозиторий в сжатом виде, менее удобно отслеживать штатными средствами (<tt>git-diff</tt>). Поскольку git хранит объекты в сжатом виде, двойное сжатие редко приводит к экономии дискового пространства. Наконец, алгоритм, применяемый для минимизации трафика при обновлении репозитория по протоколу git, заметно более эффективен на несжатых данных.
*: Сжатый разными архиваторами исходный код (как правило это tarball’ы) лучше хранить в git-репозитории в несжатом виде. Изменение файлов, которые помещены в репозиторий в сжатом виде, менее удобно отслеживать штатными средствами (<tt>git-diff</tt>). Поскольку git хранит объекты в сжатом виде, двойное сжатие редко приводит к экономии дискового пространства. Наконец, алгоритм, применяемый для минимизации трафика при обновлении репозитория по протоколу git, заметно более эффективен на несжатых данных.
** '''Отрицательная сторона''': поскольку некоторые виды сжатия одних и тех же данных могут приводить к разным результатам, может уменьшиться степень первозданности (нативности) исходного кода.
*:: '''Отрицательная сторона''': поскольку некоторые виды сжатия одних и тех же данных могут приводить к разным результатам, может уменьшиться степень первозданности (нативности) исходного кода.
 
* Распакованный исходный код.
* Распакованный исходный код.
::Исходный код, запакованный tar/cpio/..., лучше хранить в git-репозитории в распакованном виде, по тем же причинам (заметно удобнее отслеживать изменения, существенно меньше трафик при обновлении).
*: Исходный код, запакованный tar/cpio/, лучше хранить в git-репозитории в распакованном виде, по тем же причинам (заметно удобнее отслеживать изменения, существенно меньше трафик при обновлении).
** '''Отрицательная сторона''': поскольку git из информации о владельце, правах доступа и дате модификации файлов хранит только исполняемость файлов, любой архив, созданный из репозитория, будет по этим параметрам отличаться от первозданного. Помимо потери нативности, изменение прав доступа и даты модификации может теоретически повлиять на результат сборки пакета. Впрочем, такие пакеты, если они будут обнаружены, всё равно надо править.
*:: '''Отрицательная сторона''': поскольку git из информации о владельце, правах доступа и дате модификации файлов хранит только исполняемость файлов, любой архив, созданный из репозитория, будет по этим параметрам отличаться от первозданного. Помимо потери нативности, изменение прав доступа и даты модификации может теоретически повлиять на результат сборки пакета. Впрочем, такие пакеты, если они будут обнаружены, всё равно надо править.
 
* Аккуратный changelog.
* Аккуратный changelog.
::В changelog релизного commit'а стоит включать соответствующий текст из changelog'а пакета, как это делают утилиты <tt>gear-commit</tt> (обёртка к <tt>git-commit</tt>, специально предназначенная для этих целей) и <tt>gear-srpmimport</tt>. В результате можно будет получить представление об изменениях в пакете, не заглядывая в spec-файл самого пакета.
*: В changelog релизного commit’а стоит включать соответствующий текст из changelog’а пакета, как это делают утилиты <tt>gear-commit</tt> (обёртка к <tt>git-commit</tt>, специально предназначенная для этих целей) и <tt>gear-srpmimport</tt>. В результате можно будет получить представление об изменениях в пакете, не заглядывая в spec-файл самого пакета.


=== Транспорты git ===
Как известно, git может использовать разные виды транспорта для своего внутреннего протокола передачи данных, подробнее см. секцию ''GIT URLS'' в [http://www.kernel.org/pub/software/scm/git/docs/git-pull.html git-pull(1)] или [http://www.kernel.org/pub/software/scm/git/docs/git-push.html git-push(1)].  Из них rsync лучше всех подходит для первичного клонирования репозиториев большого размера по нестабильным каналам связи, только два, <tt>ssh://</tt> и <tt>git://</tt>, наиболее удобны для обновления уже существующих репозиториев, а из этих двух только ssh подходит для организации полноценного разграничения доступа. По этой причине предложенное ранее размещение git-репозиториев на <tt>rsync.altlinux.org::people/*/</tt> было заменено на полноценный ''git over ssh''.
=== Инструкция по эксплуатации git.altlinux.org ===
=== Инструкция по эксплуатации git.altlinux.org ===


Для преодоления барьеров вида «админ закрыл наружу всё и оставил только прокси» ssh на git.altlinux.org доступен также и на порту 443. Инструкция по использованию transconnect для хождения к ssh через прокси находится [[transconnect|тут]].
Для преодоления барьеров вида «админ закрыл наружу всё и оставил только прокси» ssh на git.altlinux.org доступен также и на порту 443, что можно [[fsi:SSHFirewall|использовать]].


По всем вопросам, связанным с этой частью инструкции, пишите на join@.
По всем вопросам, связанным с этой частью инструкции, пишите на join@.


Проверка связи, она же памятка:
Клонировать к себе на компьютер свой репозиторий с git.altlinux.org (SSH предварительно [[Git.alt/Справочник#SSH-доступ|настроен]]):
<pre>$ ssh git.alt help
help
git-receive-pack <directory>
git-upload-pack <directory>
charset <path to git repository> [<charset>]
clone <path to git repository> [<path to directory>]
find-package <pattern>
init-db <path to directory>
ls [<path to directory>]
mv-db <path to source directory> <path to destination directory>
quota
rm-db <path to git repository>
build <path to git repository> <tag name> <binary package repository name> [<project name>]</pre>
(вывод может меняться время от времени)
 
При входе на git.alt с вашей учётной записью USER текущим каталогом для вас будет git.alt:/people/USER/.
 
Перечень своих каталогов:
<pre>$ ssh git.alt ls
total 16
drwxr-s---  4 4096 Feb 13  2007 etc
drwxr-sr-x 13 4096 May 28 13:52 packages
drwxr-s--x  2 4096 Feb 13  2007 private
drwxr-sr-x  2 4096 Feb 13  2007 public</pre>


Перечень своих репозиториев:
$ git clone git.alt:packages/vitmp.git
<pre>$ ssh git.alt ls packages
  remote: Generating pack...
total 0</pre>
remote: Done counting 12 objects.
 
remote: Deltifying 12 objects.
Команда ls на git.alt работает относительно текущего каталога, но ей можно передавать в качестве аргумента и полные пути. Например:
remote:  100% (12/12) done
Посчитать, сколько у меня git-репозиториев на данный момент:
remote: Total 12, written 12 (delta 2), reused 12 (delta 2)
<pre>$ ssh git.alt ls /people/ldv/packages/ |grep -c ^d
317</pre>
 
Создать новый git-репозиторий (команда init-db, будучи вызваной с аргументом 'foo', создаёт репозиторий 'packages/foo.git'. При передаче аргумента, содержащего '/', такого дополнения не происходит), полюбоваться на него снаружи, удалить и снова посмотреть:
<pre>$ ssh git.alt init-db foobar
$ rsync git.altlinux.org::people/USER/packages/
Welcome to ALT Linux Team public GIT archive!
drwxr-sr-x        4096 2006/09/12 01:23:45 .
drwxr-sr-x        4096 2006/09/12 01:23:45 foobar.git
$ ssh git.alt rm-db foobar
$ rsync git.altlinux.org::people/USER/packages/
Welcome to ALT Linux Team public GIT archive!
drwxr-sr-x        4096 2006/09/12 01:23:45 .</pre>
 
Клонировать в свой каталог packages на git.alt внутренний репозиторий:
<pre>$ ssh git.alt clone /people/ldv/packages/vitmp.git
remote: Generating pack...
remote: Done counting 12 objects.
Deltifying 12 objects.
100% (remote: 12/12) done
Total 12, written 12 (delta 2), reused 12 (delta 2)</pre>
 
Клонировать в свой каталог packages на git.alt внешний репозиторий:
<pre>$ ssh git.alt clone rsync://git.altlinux.org/people/ldv/packages/vitmp.git
Welcome to ALT Linux Team public rsync archive!
receiving file list ... done
./
pack/
pack/pack-a54ac6c3e16e68ac9cf1b45218ae536a21da52ee.idx
pack/pack-a54ac6c3e16e68ac9cf1b45218ae536a21da52ee.pack
sent 175 bytes  received 4944 bytes  98765.43 bytes/sec
total size is 4629 speedup is 0.90</pre>
 
Клонировать к себе на компьютер свой репозиторий с git.altlinux.org:
<pre>$ git-clone git.alt:packages/vitmp.git
remote: Generating pack...
remote: Done counting 12 objects.
remote: Deltifying 12 objects.
remote:  100% (12/12) done
remote: Total 12, written 12 (delta 2), reused 12 (delta 2)</pre>


Клонировать к себе на компьютер чужой репозиторий с git.altlinux.org:
Клонировать к себе на компьютер чужой репозиторий с git.altlinux.org:
<pre>$ git-clone git.alt:/people/ldv/packages/vitmp.git</pre>
$ git clone git.alt:/people/ldv/packages/vitmp.git


Залить на git.alt свой ранее созданный git-репозиторий:
Залить на git.alt свой ранее созданный git-репозиторий:
<pre>cd ~/package
cd ~/package
$ git push --all git.alt:packages/package.git</pre>
$ git push --all git.alt:packages/package.git


Представим, что некий foo сделал какие-либо изменения для нашего пакета bar в бранче bar-bugfree и выложил их на git.alt.
Представим, что некий foo сделал какие-либо изменения для нашего пакета bar в бранче bar-bugfree и выложил их на git.alt.
Узнаем, как называется его этот бранч:
Узнаем, как называется его этот бранч:
<pre>$ git ls-remote git.alt:/people/foo/packages/bar.git</pre>
$ git ls-remote git.alt:/people/foo/packages/bar.git


Далее зафетчим этот бранч к нам с одноименным названием:
Далее зафетчим этот бранч к нам с одноименным названием:


<pre>$ git-fetch git.alt:/people/foo/packages/bar.git bar-bugfree:bar-bugfree</pre>
$ git fetch git.alt:/people/foo/packages/bar.git bar-bugfree:bar-bugfree


Дальше работаем с ним как хотим ;)
Дальше работаем с ним как хотим ;)


Удалить бранч на git.alt (задав пустое имя локального бранча):
Удалить бранч на git.alt (задав пустое имя локального бранча):
<pre>$ git push ... :branch</pre>
$ git push ... :branch


Копирование файлов из одного бранча в другой:
Копирование файлов из одного бранча в другой:
<pre>$ git-archive --format=tar --prefix=directory-branchXXX branchXXX:directory | tar xf -</pre>
$ git archive --format=tar --prefix=directory-branchXXX branchXXX:directory | tar xf -
и устаревший способ:
и устаревший способ:
<pre>$ git-tar-tree branchXXX:directory directory-branchXXX | tar xf -</pre>
$ git tar-tree branchXXX:directory directory-branchXXX | tar xf -
 
=== Инструкции по эксплуатации etc/packages.git ===
 
С помощью специального репозитория etc/packages.git можно настроить рассылку email-уведомлений об изменениях в git-репозиториях.
 
Рассылка уведомлений может быть двух типов:
# По инициативе подписчиков, которые выбирают, какие уведомления им нужны.
# По инициативе владельцев репозиториев, которые решают, куда рассылать уведомления.
 
Для каждого из этих типов в etc/packages.git заведено по файлу специального формата.
 
Файл для подписки на уведомления первого типа называется email-subscription и состоит из строк вида
<pre>USER PACKAGE REFTYPE REFNAME</pre>
где
* '''USER''': имя владельца репозитория (''USER'' в <tt>git_USER</tt>);
* '''PACKAGE''': имя репозитория (''PACKAGE'' в <tt>/people/USER/packages/PACKAGE.git</tt>);
* '''REFTYPE''': вид изменяемой ссылки (head, release, remote или tag);
* '''REFNAME''': имя изменяемой ссылки (basename от <tt>refs/*/*</tt>).
Каждое из этих 4-ех полей может быть либо полным именем, либо символом «*». Для пакетов также разрешён синтаксис "имя-*", с вайлдкардом в конце имени.
 
Файл для рассылки уведомлений второго типа называется email-distribution и состоит из строк вида
<pre>PACKAGE REFTYPE REFNAME MAILTO</pre>
где
* '''PACKAGE''': имя репозитория (''PACKAGE'' в <tt>/people/USER/packages/PACKAGE.git</tt>);
* '''REFTYPE''': вид изменяемой ссылки (head, release, remote или tag);
* '''REFNAME''': имя изменяемой ссылки (basename от <tt>refs/*/*</tt>);
* '''MAILTO''': разделённый запятыми список получателей (''USER1'',''USER2'').
Каждое из первых 3-ех полей может быть либо полным именем, либо символом «*». Для пакетов также разрешён синтаксис "имя-*", с вайлдкардом в конце имени.
Способ указать в MAILTO вместо идентификаторов разработчиков произвольные адреса пока не придуман.
 
Для того чтобы начать экспериментировать с email-файлами, нужно сделать
<pre>$ git-clone git.alt:etc/packages.git</pre>
Изменения этих файлов отслеживаются hooks/update'ом только если они сделаны в <tt>refs/heads/master</tt>.
 
На мой взгляд, практический интерес представляет первый тип уведомлений.  Пока писем не очень много, я записал «<tt>* * * *</tt>» в свой email-subscription.


== Ответы на часто забываемые вопросы ==
== Ответы на часто забываемые вопросы ==
''<div style="display: inline; color: red;">надо выделить страницей</div>''
=== packages, private и public ===
<pre>> А notifier не разошлет ли сообщения об загрузке новых пакетов подписавшимся на рассылки обновления всех пакетов?


Вы можете подписать кого-то на обновления своего репозитория в packages,
=== «Как найти мейнтейнера?» ===
public или private помощью etc/packages/email-distribution,
# [https://packages.altlinux.org/ru/sisyphus/srpms/gear/ https://packages.altlinux.org/ru/sisyphus/srpms/gear/] датами и ссылками)
etc/public/email-distribution и etc/private/email-distribution,
# [http://git.altlinux.org/people-packages-list http://git.altlinux.org/people-packages-list]
соответственно), но подписаться можно только на обновления чужих
# см. ниже:
packages и public (с помощью etc/packages/email-subscription
{{Начало цитаты|источник=[http://lists.altlinux.org/pipermail/devel/2007-March/043158.html ldv@]}}
и etc/public/email-subscription соответственно).
> Слить сорцы из git'а, сделать патч и отправить автору (да, в мире существуют <br />
Подписаться на чужой private нельзя.</pre>
> другие git-репозитории, помимо git.a.o). Совершенно обычный use-case для того <br />
''ldv@ в devel@''
> типа пользователя, кого сейчас в инфраструктуре совершенно игнорируют: casual <br />
> mantainers, которых почти всё устраивает, но иногда хочется написать патчик и <br />
> отправить обратно.


=== «Как найти майнтейнера?» ===
1. [http://alt3.linux.kiev.ua/srpm/Sisyphus/spt/git http://alt3.linux.kiev.ua/srpm/Sisyphus/spt/git] (с датами и ссылками)
2. [http://git.altlinux.org/people-packages-list http://git.altlinux.org/people-packages-list]
3. см. ниже:
<pre>> Слить сорцы из git'а, сделать патч и отправить автору (да, в мире существуют
> другие git-репозитории, помимо git.a.o). Совершенно обычный use-case для того
> типа пользователя, кого сейчас в инфраструктуре совершенно игнорируют: casual
> mantainers, которых почти всё устраивает, но иногда хочется написать патчик и
> отправить обратно.
В принципе, даже той информации, которая есть в бинарном пакете сейчас,
В принципе, даже той информации, которая есть в бинарном пакете сейчас,
уже достаточно для casual mantainers:
уже достаточно для casual mantainers:
1. В установленном бинарном пакете есть %{SOURCERPM} (виден по rpmquery -i),
1. В установленном бинарном пакете есть %{SOURCERPM} (виден по rpmquery -i),
из которого однозначно вычисляется имя исходного пакета.
из которого однозначно вычисляется имя исходного пакета.
2. Далее, в установленном бинарном пакете есть %{CHANGELOGNAME} (виден по
2. Далее, в установленном бинарном пакете есть %{CHANGELOGNAME} (виден по
rpmquery --lastchange).
rpmquery --lastchange).
3. По именам мантейнера (MAINT) и исходного пакета (PKG) можно с очень
3. По именам мантейнера (MAINT) и исходного пакета (PKG) можно с очень
высокой вероятностью предположить, что если пакет был собран из
высокой вероятностью предположить, что если пакет был собран из
git-репозитория, то этот репозиторий называется
git-репозитория, то этот репозиторий называется
http://git.altlinux.org/people/MAINT/packages/?p=PKG.git</pre>
<nowiki>http://git.altlinux.org/people/MAINT/packages/?p=PKG.git</nowiki>
''[http://lists.altlinux.org/pipermail/devel/2007-March/043158.html ldv@]''
{{Конец цитаты}}


=== Как вести пакет в git ===
=== Как вести пакет в git ===
==== damir@ ====
{{Начало цитаты|источник={{man|damir}}}}
<pre>Посмотрите на http://git.altlinux.org/people/damir/packages/?p=liblazy.git;a=summary
Посмотрите на http://git.altlinux.org/people/damir/packages/?p=liblazy.git;a=summary


Там правда апстрим git-овый, но это сути не меняет.
Там правда апстрим git-овый, но это сути не меняет.
Строка 243: Строка 135:
При переезде на новую версию надо будет всего лишь:
При переезде на новую версию надо будет всего лишь:


1. Поставить нужный тег на апстримной ветке (например liblazy-0.2).
1. Поставить нужный тег на апстримной ветке (например liblazy-0.2). <br />
2. Смержить этот тег в master с -s ours
2. Смержить этот тег в master с -s ours <br />
3. Заменить в спеке версию с 0.1 на 0.2.
3. Заменить в спеке версию с 0.1 на 0.2. <br />
4. Выполнить gear-update-tag -ac
4. Выполнить gear-update-tag -ac <br />
5. Дописать changelog</pre>
5. Дописать changelog
{{Конец цитаты}}


=== Как втащить пакет из Сизифа, если его нет на git.alt/people ===
=== Как втащить пакет из Сизифа, если его нет на git.alt/people ===
Пакет, который давно не собирался или заброшен, или его майнтейнер не пользуется git.alt, можно найти в [http://git.altlinux.org/archive/ архиве Сизифа]. Архив Сизифа содержит последние версии когда-либо собиравшихся в Сизиф пакетов (с историей) и доступен по <tt>ssh git.alt</tt> в каталоге <tt>/archive</tt>. Для удобства хранилища собраны в двухуровневое дерево (по первой букве), без различия майнтейнеров.
Пакет, который давно не собирался или заброшен, или его мейнтейнер не пользуется git.alt, можно найти в [http://git.altlinux.org/archive/ архиве Сизифа]. Архив Сизифа содержит последние версии когда-либо собиравшихся в Сизиф пакетов (с историей) и доступен по <tt>ssh git.alt</tt> в каталоге <tt>/archive</tt>. Для удобства хранилища собраны в двухуровневое дерево (по первой букве), без различия мейнтейнеров.


Таким образом ''на сегодня'' <tt>git-clone git.alt:/archive/m/mkimage</tt> отдаст хранилище, соответствующее текущему пакету <tt>mkimage</tt> в Сизифе, кто бы его ни собрал на этот раз.
Таким образом ''на сегодня'' <tt>git-clone git.alt:/archive/m/mkimage</tt> отдаст хранилище, соответствующее текущему пакету <tt>mkimage</tt> в Сизифе, кто бы его ни собрал на этот раз.


=== Ссылки ===
=== workflow ===
* [http://www.kernel.org/pub/software/scm/git/docs/everyday.html Everyday Git] With 20 Commands Or So
 
* [http://www.freesource.info/wiki/AltLinux/Sisyphus/devel/gear Использование gear]
Совместная работа над пакетами в git строится по следующей схеме:
* [[git/recommit|Как переделать commit]], в котором сразу же нашёлся ляп
 
* [[git/MergingBranches|Как мержить бранчи]], поддерживая пакет с N пересекающимися патчами
[ user A ]        [ user B ]
* [[git/gitincompact|Как установить git в Compact 3.0]]
    |  [repo A/X]    |
* [http://lwn.net/Articles/245678/ Линкдамп] по документации git
    |      |          |
** [http://www.kernel.org/pub/software/scm/git/docs/tutorial.html tutorial] по 1.5+, в частности
    |      |----------+-->[repo B/X]  -- B клонирует репозиторий A/X в свой B/X
    |      |          |      |
    |      |          |------>|      -- B работает над содержимым репозитория
    |      |          |------>|
    |      |          |------>|      -- B решает, что результат ему нравится
    |<-----------------|      |      -- B оповещает A о том, что в B/X
    |      |          |      |          имеется что-то новое
    |-------+<-----------------|      -- A добавляет (pull/push) содержимое
    |      |          |      |          B/X в A/X
 
При дальнейшей работе сценарий повторяется, за исключением того, что B не клонирует репозиторий A/X, а подтягивает (pull) из него новые изменения.
 
Как это реализуется на практике?
 
Для поиска репозитория для клонирования используется команда <tt>find-package</tt>:
$ ssh git.alt find-package bugzilla
/people/vvk/packages/bugzilla.git 1168522087
$
Склонировать репозиторий можно с помощью команды <tt>clone</tt>:
$ ssh git.alt clone /people/vvk/packages/bugzilla.git
Initialized empty Git repository in /people/dottedmag/packages/bugzilla.git/
$
Эта команда создаст вашу копию репозитория ''на сервере git.alt''. Для работы с ним необходимо склонировать этот репозиторий на локальную машину:
$ git clone ssh://git.alt/people/dottedmag/packages/bugzilla.git
Initialized empty Git repository in /home/dottedmag/bugzilla/.git/
....
$
С этим git-репозиторием можно работать как обычно: править, делать commit и так далее. Поскольку для склонированного репозитория создаётся remote с названием origin, то <tt>git-push</tt> тоже работает:
$ git push
...
$
Нотификации производятся вручную - почтой или через bugzilla. Аналога pull request из github или gitorious на <tt>git.alt</tt> пока что нет.
 
Втягивание чужих изменений производится стандартными git-средствами: добавлением remote
$ git remote add someuser ssh://git.alt/people/someuser/packages/bugzilla.git
засасыванием изменений:
$ git fetch someuser master
наложением их:
$ git merge someuser/master
и отправкой в <tt>git.alt</tt>:
$ git push
 
== Удаление удалённых веток в git ==
 
Если вы хотите удалить ветку из репозитория, располагающегося не на вашей машине — сделайте в него <tt>push</tt> из «никакой» ветки:
 
git push origin :no-longer-needed-branch
 
или если хотите удалить тег:
 
git push origin :no-longer-needed-tag
 
Полная форма <tt>push</tt> выглядит так:
git push <remote repository> [<local branch>:]<remote branch>
 
где <tt><local branch></tt> — имя локальной ветки, из которой берутся данные, а <tt><remote branch></tt> — имя ветки в удалённом репозитории, куда происходит их передача с замещением имеющегося. Привычный вид <tt>git push <remote repo> <remote branch></tt> является лишь одной из реализаций этой полной формы.
 
==Апстрим в SVN==
{{main|Git/svn}}
 
<div id="links"></div>
== Ссылки ==
=== По-русски ===
* [http://freesource.info/wiki/RuslanHihin/GitTutorial1 Учебник «Введение в git» (для версии 1.5.1 или более поздней версии]
* [http://freesource.info/wiki/RuslanHihin/20povsedevnyxkomandgit 20 повседневных команд git]
* [http://freesource.info/wiki/RuslanHihin/GitUserManual Главы из руководства пользователя git]
* [http://los-t.livejournal.com/tag/git%20guts git guts] (внутренности git)
* [http://blog.tarantsov.com/2008/11/essential-git.html Введение в структуру хранилища git] (полезно для понимания происходящего)
* [http://admdev.blogspot.com/2009/02/git.html Практическое введение в git] (нечто вроде quickstart без привязки к специфике ALT)
* [http://git-scm.com/book/ru/v2 Pro git] (перевод второго издания вышедшей недавно книги, без привязки к специфике ALT)
* [http://wiki.etersoft.ru/UsesGit Использование Git для разработки в Etersoft]
* [http://www.opennet.ru/base/dev/git_kung_fu.txt.html Правила хорошего тона при работе с git в многопользовательском окружении]
 
=== Вводные статьи ===
* [http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/ Intro to Distributed Version Control (Illustrated])
* [http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/ Intro to Distributed Version Control (Illustrated])
* [http://www.infoq.com/articles/dvcs-guide Distributed Version Control Systems: A Not-So-Quick Guide Through]
* [http://cworth.org/hgbook-git/tour/ A tour of git: the basics]
* [http://www.opensolaris.org/os/community/tools/scm/git-report-final.txt Обзор git] для сообщества OpenSolaris
* '''[http://www.kernel.org/pub/software/scm/git/docs/giteveryday.html Everyday Git] With 20 Commands Or So'''
* [http://freesource.info/wiki//RuslanHihin/GitTutorial1 Учебник "введение в git" (для версии 1.5.1 или более поздняя версия]
* [http://git.or.cz/course/svn.html ...для SVN-щика]
* [http://freesource.info/wiki//RuslanHihin/20povsedevnyxkomandgit 20 повседневных команд git]  
 
* [http://freesource.info/wiki//RuslanHihin/GitUserManual Главы из руководства пользователя git]
=== Официальная документация ===
* [http://www.kernel.org/pub/software/scm/git/docs/user-manual.html Git User's Manual]
* [http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html gittutorial(7)]
* [http://kernel.org/pub/software/scm/git/docs/howto/ Git Howtos]
* [http://git.or.cz/gitwiki/ GitWiki]
* [http://git.or.cz/gitwiki/ GitWiki]
** [http://git.or.cz/gitwiki/GitDocumentation GitDocumentation]
** [http://git.or.cz/gitwiki/GitDocumentation GitDocumentation]
Строка 278: Строка 247:
** [http://git.or.cz/gitwiki/Aliases Aliases]
** [http://git.or.cz/gitwiki/Aliases Aliases]
** [http://git.or.cz/gitwiki/GitGlossary GitGlossary]
** [http://git.or.cz/gitwiki/GitGlossary GitGlossary]
=== tips&tricks ===
* [[git/recommit|Как переделать commit, в котором сразу же нашёлся ляп]]
* [[git/MergingBranches|Как мержить бранчи]], поддерживая пакет с N пересекающимися патчами
* [http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html Zack Rusin: Git cheat sheet] ([http://www.samlown.com/uploads/documents/git-cheat-sheet-a4.pdf A4])
* [http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html Zack Rusin: Git cheat sheet] ([http://www.samlown.com/uploads/documents/git-cheat-sheet-a4.pdf A4])
* [http://tomayko.com/writings/the-thing-about-git The Thing About Git]
* [http://article.gmane.org/gmane.comp.version-control.git/31625 Branching and merging with git]
* [http://www.ndpsoftware.com/git-cheatsheet.html Wonderful git cheatsheet]
=== Разное ===
* [http://github.com/guides GitHub: Git Guides]
* [http://www.gitcasts.com/ GitCasts]
* [http://gitfu.wordpress.com/ git-fu]
* [http://lwn.net/Articles/245678/ Линкдамп] по документации git
* [http://www-cs-students.stanford.edu/~blynn/gitmagic/index.html Git Magic]
* [http://linux.yyz.us/git-howto.html Kernel Hackers' Guide to git]
* [http://linux.yyz.us/git-howto.html Kernel Hackers' Guide to git]
* [http://cworth.org/hgbook-git/tour/ A tour of git: the basics]
* [http://osteele.com/archives/2008/05/my-git-workflow My Git Workflow]
* [http://www.opensolaris.org/os/community/tools/scm/git-report-final.txt Обзор git] для сообщества OpenSolaris
* [http://www.sourcemage.org/Git_Guide Git Guide - SourceMage Wiki]
* [http://www.sourcemage.org/Git_Guide Git Guide - SourceMage Wiki]
* [http://www-cs-students.stanford.edu/~blynn/gitmagic/index.html Git Magic]
* [http://www.infoq.com/articles/dvcs-guide Distributed Version Control Systems: A Not-So-Quick Guide Through]
* [http://gitfu.wordpress.com/ git-fu]
* [http://versioncontrolblog.com/ Version Control Blog]
* [http://versioncontrolblog.com/ Version Control Blog]
* [http://github.com/guides GitHub: Git Guides]
* [http://thread.gmane.org/gmane.comp.video.dri.devel/34739/focus=34744 Linux kernel "clean history" tips]
* [http://kernel.org/pub/software/scm/git/docs/howto/ Git Howtos]
* [http://krlmlr.github.io/using-gitattributes-to-avoid-merge-conflicts/ Using .gitattributes to avoid merge conflicts] (по NEWS и подобным)
* [http://www.gitcasts.com/ GitCasts]
* [http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/ Use vimdiff as git mergetool]
 
{{Category navigation|title=git|category=git|sortkey=*}}

Текущая версия от 16:17, 26 февраля 2023

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Руководства

Всё о GIT, со слов ldv@

На самом деле не про git как таковой, а про git применительно к ALT Linux и git.alt; некое подобие QuickStart по git@ALT для присматривающихся участников team — здесь.

В качестве введения в git смотрите Управление исходным кодом с помощью Git (на русском языке) и Everyday GIT (на английском языке).

Примечание: все примеры команд, указываемых через дефис (например, git-clone) на последних версиях Git следует применять без дефиса, заменив его пробелом: git clone.

NB: эту страницу (а также gear, git/start2, gear/geartags, gear/ImportUpstreamVBranch, gear/ImportSeparateUpstream, git/recommit, git/gitnotes, git/SomeDestReposViaBranches, git/MergingBranches, git/BranchInGit) надо творчески раскромсать на:

GEAR

В апреле 2006 года идея хранить исходный код пакетов в git-репозитории была реализована с помощью утилиты, которая 27-го апреля получила имя gear. Напомню вкратце:

Основной смысл хранения исходного кода пакетов в git-репозитории заключается в более эффективной и удобной совместной разработке, а также минимизации трафика и места на диске для хранения архива репозитория за длительный срок. Идея gear заключается в том, чтобы с помощью одного файла с простыми правилами (для обработки которых достаточно git+sed) можно было собирать пакеты из произвольно устроенного git-репозитория, по аналогии с hasher, который был задуман как средство собирать пакеты из произвольных srpm-пакетов.

За время, прошедшее с конца апреля, многие из вас успели освоиться с gear, появилась базовая документация, семейство вспомогательных утилит и опыт эксплуатации. Поэтому весьма вероятно, что те из вас, кому только предстоит осваивать gear, пройдут этот путь гораздо легче и быстрее чем я.  :) Например, одна только утилита gear-srpmimport позволяет на начальном этапе вообще не интересоваться синтаксисом файла .gear-rules.

На всякий случай рекомендую установить/обновить пакет gear, а также освежить в своей памяти содержимое файлов /usr/share/doc/gear-1.4.0/QUICKSTART.ru.html и /usr/share/doc/git-1.5.5.3/tutorial.html

Структура репозитория

Как уже было сказано, gear не накладывает ограничений на внутреннюю организацию git-репозитория (не считая файла с правилами). Тем не менее, у меня есть несколько соображений о том, как более эффективно и удобно организовывать git-репозитории, предназначенные для хранения пакетов:

  • Одна сущность — один репозиторий.
    Не стоит помещать в один репозиторий несколько разных пакетов, за исключением случаев, когда у этих пакетов есть общий пакет-предок. Соблюдение этого правила облегчает совместную работу над пакетом, поскольку не перегруженный репозиторий легче клонировать и в целом инструментарий git больше подходит для работы с такими репозиториями.
    Отрицательная сторона: несколько сложнее делать «push» и «pull» в случае, когда репозиториев, которые надо обработать, много. Впрочем, push/pull в цикле выручает.
  • Несжатый исходный код.
    Сжатый разными архиваторами исходный код (как правило это tarball’ы) лучше хранить в git-репозитории в несжатом виде. Изменение файлов, которые помещены в репозиторий в сжатом виде, менее удобно отслеживать штатными средствами (git-diff). Поскольку git хранит объекты в сжатом виде, двойное сжатие редко приводит к экономии дискового пространства. Наконец, алгоритм, применяемый для минимизации трафика при обновлении репозитория по протоколу git, заметно более эффективен на несжатых данных.
    Отрицательная сторона: поскольку некоторые виды сжатия одних и тех же данных могут приводить к разным результатам, может уменьшиться степень первозданности (нативности) исходного кода.
  • Распакованный исходный код.
    Исходный код, запакованный tar/cpio/…, лучше хранить в git-репозитории в распакованном виде, по тем же причинам (заметно удобнее отслеживать изменения, существенно меньше трафик при обновлении).
    Отрицательная сторона: поскольку git из информации о владельце, правах доступа и дате модификации файлов хранит только исполняемость файлов, любой архив, созданный из репозитория, будет по этим параметрам отличаться от первозданного. Помимо потери нативности, изменение прав доступа и даты модификации может теоретически повлиять на результат сборки пакета. Впрочем, такие пакеты, если они будут обнаружены, всё равно надо править.
  • Аккуратный changelog.
    В changelog релизного commit’а стоит включать соответствующий текст из changelog’а пакета, как это делают утилиты gear-commit (обёртка к git-commit, специально предназначенная для этих целей) и gear-srpmimport. В результате можно будет получить представление об изменениях в пакете, не заглядывая в spec-файл самого пакета.

Инструкция по эксплуатации git.altlinux.org

Для преодоления барьеров вида «админ закрыл наружу всё и оставил только прокси» ssh на git.altlinux.org доступен также и на порту 443, что можно использовать.

По всем вопросам, связанным с этой частью инструкции, пишите на join@.

Клонировать к себе на компьютер свой репозиторий с git.altlinux.org (SSH предварительно настроен):

$ git clone git.alt:packages/vitmp.git
remote: Generating pack...
remote: Done counting 12 objects.
remote: Deltifying 12 objects.
remote:  100% (12/12) done
remote: Total 12, written 12 (delta 2), reused 12 (delta 2)

Клонировать к себе на компьютер чужой репозиторий с git.altlinux.org:

$ git clone git.alt:/people/ldv/packages/vitmp.git

Залить на git.alt свой ранее созданный git-репозиторий:

cd ~/package
$ git push --all git.alt:packages/package.git

Представим, что некий foo сделал какие-либо изменения для нашего пакета bar в бранче bar-bugfree и выложил их на git.alt. Узнаем, как называется его этот бранч:

$ git ls-remote git.alt:/people/foo/packages/bar.git

Далее зафетчим этот бранч к нам с одноименным названием:

$ git fetch git.alt:/people/foo/packages/bar.git bar-bugfree:bar-bugfree

Дальше работаем с ним как хотим ;)

Удалить бранч на git.alt (задав пустое имя локального бранча):

$ git push ... :branch

Копирование файлов из одного бранча в другой:

$ git archive --format=tar --prefix=directory-branchXXX branchXXX:directory | tar xf -

и устаревший способ:

$ git tar-tree branchXXX:directory directory-branchXXX | tar xf -

Ответы на часто забываемые вопросы

«Как найти мейнтейнера?»

  1. https://packages.altlinux.org/ru/sisyphus/srpms/gear/ (с датами и ссылками)
  2. http://git.altlinux.org/people-packages-list
  3. см. ниже:

ldv@:

> Слить сорцы из git'а, сделать патч и отправить автору (да, в мире существуют
> другие git-репозитории, помимо git.a.o). Совершенно обычный use-case для того
> типа пользователя, кого сейчас в инфраструктуре совершенно игнорируют: casual
> mantainers, которых почти всё устраивает, но иногда хочется написать патчик и
> отправить обратно.

В принципе, даже той информации, которая есть в бинарном пакете сейчас, уже достаточно для casual mantainers:

1. В установленном бинарном пакете есть %{SOURCERPM} (виден по rpmquery -i), из которого однозначно вычисляется имя исходного пакета.

2. Далее, в установленном бинарном пакете есть %{CHANGELOGNAME} (виден по rpmquery --lastchange).

3. По именам мантейнера (MAINT) и исходного пакета (PKG) можно с очень высокой вероятностью предположить, что если пакет был собран из git-репозитория, то этот репозиторий называется http://git.altlinux.org/people/MAINT/packages/?p=PKG.git

Как вести пакет в git

damir@:

Посмотрите на http://git.altlinux.org/people/damir/packages/?p=liblazy.git;a=summary

Там правда апстрим git-овый, но это сути не меняет. .gear-rules там состоит из одной строчки - вот такой:

tar.bz2: @name@-@version@:.

@name@ и @version@ берутся из спека. @name@ - это liblazy. а @version@ - это 0.1

На ветке upstream присутствует тег liblazy-0.1. Поэтому апстримный тарбол будет браться из этого тега.

При переезде на новую версию надо будет всего лишь:

1. Поставить нужный тег на апстримной ветке (например liblazy-0.2).
2. Смержить этот тег в master с -s ours
3. Заменить в спеке версию с 0.1 на 0.2.
4. Выполнить gear-update-tag -ac
5. Дописать changelog

Как втащить пакет из Сизифа, если его нет на git.alt/people

Пакет, который давно не собирался или заброшен, или его мейнтейнер не пользуется git.alt, можно найти в архиве Сизифа. Архив Сизифа содержит последние версии когда-либо собиравшихся в Сизиф пакетов (с историей) и доступен по ssh git.alt в каталоге /archive. Для удобства хранилища собраны в двухуровневое дерево (по первой букве), без различия мейнтейнеров.

Таким образом на сегодня git-clone git.alt:/archive/m/mkimage отдаст хранилище, соответствующее текущему пакету mkimage в Сизифе, кто бы его ни собрал на этот раз.

workflow

Совместная работа над пакетами в git строится по следующей схеме:

[ user A ]         [ user B ]
    |   [repo A/X]     |
    |       |          |
    |       |----------+-->[repo B/X]  -- B клонирует репозиторий A/X в свой B/X
    |       |          |       |
    |       |          |------>|       -- B работает над содержимым репозитория
    |       |          |------>|
    |       |          |------>|       -- B решает, что результат ему нравится
    |<-----------------|       |       -- B оповещает A о том, что в B/X
    |       |          |       |          имеется что-то новое
    |-------+<-----------------|       -- A добавляет (pull/push) содержимое
    |       |          |       |          B/X в A/X

При дальнейшей работе сценарий повторяется, за исключением того, что B не клонирует репозиторий A/X, а подтягивает (pull) из него новые изменения.

Как это реализуется на практике?

Для поиска репозитория для клонирования используется команда find-package:

$ ssh git.alt find-package bugzilla
/people/vvk/packages/bugzilla.git	1168522087
$

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

$ ssh git.alt clone /people/vvk/packages/bugzilla.git
Initialized empty Git repository in /people/dottedmag/packages/bugzilla.git/
$

Эта команда создаст вашу копию репозитория на сервере git.alt. Для работы с ним необходимо склонировать этот репозиторий на локальную машину:

$ git clone ssh://git.alt/people/dottedmag/packages/bugzilla.git
Initialized empty Git repository in /home/dottedmag/bugzilla/.git/
....
$

С этим git-репозиторием можно работать как обычно: править, делать commit и так далее. Поскольку для склонированного репозитория создаётся remote с названием origin, то git-push тоже работает:

$ git push
...
$

Нотификации производятся вручную - почтой или через bugzilla. Аналога pull request из github или gitorious на git.alt пока что нет.

Втягивание чужих изменений производится стандартными git-средствами: добавлением remote

$ git remote add someuser ssh://git.alt/people/someuser/packages/bugzilla.git

засасыванием изменений:

$ git fetch someuser master

наложением их:

$ git merge someuser/master

и отправкой в git.alt:

$ git push

Удаление удалённых веток в git

Если вы хотите удалить ветку из репозитория, располагающегося не на вашей машине — сделайте в него push из «никакой» ветки:

git push origin :no-longer-needed-branch

или если хотите удалить тег:

git push origin :no-longer-needed-tag

Полная форма push выглядит так:

git push <remote repository> [<local branch>:]<remote branch>

где <local branch> — имя локальной ветки, из которой берутся данные, а <remote branch> — имя ветки в удалённом репозитории, куда происходит их передача с замещением имеющегося. Привычный вид git push <remote repo> <remote branch> является лишь одной из реализаций этой полной формы.

Апстрим в SVN

Основная статья: Git/svn


Ссылки

По-русски

Вводные статьи

Официальная документация

tips&tricks

Разное