[devel] git question.

Alexey Morozov =?iso-8859-1?q?morozov=5Fml_=CE=C1_ngs=2Eru?=
Чт Дек 18 14:22:49 MSK 2008


On Thursday 18 December 2008 16:03:17 Denis Medvedev wrote:
> Добрый день!
> Какая правильная процедура поднятия версии при работе в git?
> У меня был xxx-1.0.tar.gz
> Я его залил в гит, помучал(коммиты есть), опакетил для сизифа.
> Вышел xxx-2.0.tar.gz
> Я попробовал сделать следующее:
> git-branch 2.0
> распаковал туда архив
> git-commit -a
> git-checkout master
> git-merge 2.0
> Все успешно проехало... но мои изменения-адаптации к cизифу были
> благополучно выкинуты и заменены новой версией файлов! Что я не так делаю?
> Как правильно?

Вероятнее всего, правильно примерно так:

1. есть ветка с апстримовскими сорцами, назовём её, скажем, upstream.
в неё заливаются, как есть, сорцы версии 1.0, желательно в распакованном виде.
Ставим метку (что-то типа upstream-1.0)

2. если нужны фиксы, находясь в этой точке (ветка upstream, пометка 
upstream/1.0) создаем бранч(и) для фиксов. В простейшем случае это будет 1 
бранч, в котором будут накапливаться коммиты, исправляющие апстрим: git 
checkout -b fixes. По сути, в ветке fixes будут находиться исходники в том 
состоянии, из которого Вы потом собираете rpm. Ставим соответствующую метку, 
например, fixes-1.0-alt1.

3. в момент выхода 2.0 сорцы заливаются в ветку upstream, ставится пометка 
upstream-2.0. Таким образом, git diff upstream-1.0..upstream-2.0 даст разницу 
между первой и второй версиями.

4. Далее "апгрейдим" патчи. Переходим в ветку fixes и говорим там git merge 
upstream. Разруливаем конфликты, в итоге получаем в ветке fixes "пофикшенную" 
версию upstream. Ставим соответствующую метку.

5. Что касается собственно пакетирования, то здесь возможны нюансы. Совсем 
страшный способ заключается в том, что для spec'а, .gear-rules и прочего 
сугубо мэнтейнерского хозяйства делается _отдельная_ ветка (назовём её srpm), 
не связанная поначалу ни c одной из существующих веток (как это сделать - 
вопрос отдельный). Далее делаем следующие пассы руками, головой и другими 
частями тела:

5.1. Находясь в ветке srpm говорим:
git merge -s ours --no-commit upstream-2.0 fixes-2.0 (или любой другой 
требуемой Вам версии)
5.2. Вписываем соответствующую версию в спек, желательно, непосредственно в 
поле Version:
5.2. В Source в спеке пишем %name-%version.tar.bz2 - здесь будут апстримовские 
исходники.
5.3. В Patch пишем %name-%version-alt_fixes.patch - здесь будет кумулятивный 
патч из ветки fixes. Можно сделать несколько патчей, по темам, но тогда 
придётся их описывать более аккуратно (см. ниже).
5.4. Вписываем подходящий релиз и ченджлог.
5.5. В .gear-rules пишем что-то навроде следующего:
tar.bz2: upstream- на version@:. <здесь параметры для gear, поиграйтесь с тем, 
чтобы достичь требуемого вида архива>
diff: upstream- на version@:. fixes- на version@- на release@:. <остальные параметры 
для diff>
5.6. Добавляем (git add) спек и .gear-rules
5.7. Не забываем сказать gear-update-tag -a
5.8. Коммиттим

Собственно, всё, можно говорить

gear --rpmbuild -- 
rpmbuild -bs --nodeps --define "_srcrpmdir  /home/alex/RPM/hsh/queue/"

Это, в общем, один из самых страшных способов, он позволяет напрочь разделить 
апстримовскую, "фиксящую" и  мэнтейнерскую части (в последнюю могут войти, 
например, патчи или какие-нибудь дополнительные файлы, которые интересны 
только в рамках ALTLinux).

Для тех, кому вышеперечисленное кажется сильно страшным, можно, не мудрствуя, 
после шага 4 засунуть спек непосредственно в ветку fixes и написать 
в .gear-rules:

tar.bz2:.

Но это уже на любителя.

P.S. Пишу, тыкскыть, на память, не обессудьте, если где-то надо подрихтовать. 
Но в целом - работает, "проверено на себе" (tm).

С уважением,
Алексей Морозов


Подробная информация о списке рассылки Devel