git/BranchInGit

Материал из ALT Linux Wiki
< Git
Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.

Приёмы работы с пакетами в git

15:44 < Lost> обновился апстрим например
15:44 < Lost> делаю git checkout upstream
15:44 < swi> git co patch; git merge upstream; git co master; git merge patch?
15:44 < Lost> git-tag -s 'KoLmafia-11.5' например или что-то типа того, чтобы зафиксировать ревизию
15:45  * swi заткнулся и внимает
15:45 < Lost> далее делаю git-checkout equipment-fixes (ветка с приложенным патчем)
15:45 < Lost> git-merge KoLmafia-11.5 (тег, полученный при предыдущем шаге)
15:46 < Lost> можно в принципе делать git-merge upstream -
будет то же самое, но тег как-то солиднее, да и нужен он будет позднее
15:46 < Lost> далее смотрю, ровненько ли прошел merge, не надо ли чего подправить
15:46 < Lost> если все в порядке, кладу еще один тег
15:47 < Lost> git-tag -s equipment-11.5
15:47 < Lost> теперь патчик мой будет генериться между двумя этими тегами
15:47 < Lost> далее git-checkout master
15:47 < Lost> git-merge equipment-11.5
15:47 < Lost> gear-update-tag KoLmafia-11.5
15:47 < Lost> gear-update-tag equipment-11.5
15:48 < Lost> это вносит новые теги в специальную папочку .gear-tags
15:48 < Lost> чтобы gear их мог видеть
15:48  * swi кивнул
15:48 < Lost> а дальше нужны хитрые строчки в .gear-rules
15:49 < Lost> первая строчка - tar.gz: KoLmafia-11.5:KoLmafia
15:49 < Lost> это говорит геару, что тарбол надо брать из тега KoLmafia-11.5 (ну то есть апстрима)
15:49 < swi> ооо
15:50 < Lost> следующая строчка - diff: KoLmafia-11.5:KoLmafia equipment-11.5:KoLmafia name=<имя патчега>
15:50 < Lost> это говорит что патчег <имя патчега> надо брать путем сравнения двух тегов
15:51 < Lost> первый находится на ветке upstream, второй - на ветке equipment-fixes
15:51 < Lost> ну а дальше прописываю этот патчег в KoLmafia.spec
15:51 < Lost> и как обычно, %patch0 -p1 :)
15:52 < swi> оооооооооооооо
15:52 < Lost> увеличиваю релиз/версию в спеке, add_changelog, заполняю ченджлог, потом проверочная сборка
15:52 < swi> я б сказал даже вау.. но не гламурен
15:52 < Lost> если все в порядке - тогда gear-commit -a
15:52 < Lost> а потом gear-create-tag (новая приблуда в новом геаре)
15:53 < Lost> она создаст тег релиза, по которому в будущем вроде как должна запускаться автоматическая сборка
11:54 < Lost> ну типа так:
11:54 < Lost> mkdir qtemu
11:54 < Lost> cd qtemu
11:54 < Lost> tar -xf qtemu-0.3.tar.gz
11:54 < Lost> mv qtemu-0.3 qtemu
11:54 < Lost> git-init
11:54 < Lost> git-add qtemu
11:54 < Lost> git-commit -m 'Initial import of qtemu-0.3'
11:55 < Lost> git-checkout -b upstream
11:55 < Lost> git-tag -m 'qtemu-0.3' -s qtemu-0.3
11:56 < Lost> потом сразу импортишь следующий релиз
11:56 < Lost> gear-update ~/tmp/qtemu-0.4.tar.gz qtemu && git-commit -a -m 'qtemu-0.4' && git-tag -m 'qtemu-0.4' -s qtemu-0.4
11:57 < Lost> то есть у тебя в ветке upstream получатся последовательные релизы, каждый из которых обозначен тегом
11:57 < Lost> далее ты делаешь git-checkout master
11:57 < Lost> добавляешь .gear-rules и спек от qtemu-0.3-alt1
11:58 < Lost> коммитишь
11:58 < Lost> ну и т.д. Потом делаешь git-merge qtemu-0.4 и коммитишь спек от qtemu-0.4-alt1
16:53 < stanv> а как можно сразу все бранчи забрать ?
16:58 < Lost> stanv: а зачем?
16:59 < Lost> вроде отдельной команды нету для этого
16:59 < stanv> :) например доступа к origin не всегда есть :)
17:00 < Lost> stanv: не понял про доступ
17:01 < stanv> ну выключили инет, и на remote branch перейти (взять себе) уже не сможешь
17:01 < Lost> stanv: чаво?
17:01 < Lost> ты упал чтоли?
17:02 < Lost> если ты сделал git-clone, у тебя полная копия репозитория
17:02 < Lost> со всеми тагами, бранчами и прочим
17:02 < Lost> дальше тебе исходный репо нужен только для git-push и git-pull
17:02 < stanv> только теперь к имени бранчам появился префикс origin ?
17:04 < Lost> stanv: эти бранчи стали remotes
17:04 < Lost> stanv: они отслеживают состояние бранчей в исходном репо
17:04 < Lost> их менять низя
17:04 < Lost> зато из них можно делать свои локальные бранчи
17:04 < stanv> аа!
17:05 < stanv> прозрел :)
17:08 < stanv> еще про tags роскажи и все :) tag - это commit в ветке. если я удалю ветку, все таги для коммитов этой ветки тоже удалятся *
17:08 < stanv> ?
17:08 < Lost> tag - это сцылко на коммит
17:08 < Lost> сам по себе он является таким же полноправным ref, как и ветко
17:09 < Lost> если ты удалишь ветку, таг останеццо
17:09 < stanv> и ?
17:09 < Lost> таг отличается от ветки тем, что в ветку можно коммитить
17:10 < Lost> и то, что таг может быть объектом (полновесный таг то есть)
17:10 < Lost> или легковесным (только сцылко в refs/tags)
17:10 < Lost> а ветка может быть только легковесной
17:10 < stanv> т.е. если я удаляю ветку, все коммиты в нее остаются ?
17:11 < Lost> как сцылко в refs/heads или в refs/remotes
17:12 < Lost> если на эти коммиты есть какие-либо другие сцылки, то не удалятся
17:12 < Lost> и даже если нету - коммиты удалятся только после git-prune
  < Lost> до гит-пруне даже есть шанс их обратно восстановить
  < lioka> Lost: а каг ?
17:16  * lioka как-то грохнул origin, было печально
17:17 < Lost> lioka: git-lost-found
17:17  * lioka так и думал
< vvk> stanv_: v@version@:postfix - это указание взять директорию postfix из тэга v@version@ и сделать дифф с директорией postfix из текущего бранча
15:10 < stanv_> ок, а что такое текущий бранч для gear ?
15:10 < thresh> тот, в котором .gear-rules
15:10 < stanv_> во
15:11 < Lost> непрально
15:11 < stanv_> а я хочу задать не текущий бранч
15:11 < Lost> нету для геара никакого текущего бранча
15:11 < Lost> и не было никогда
15:11 < Lost> есть объект-коммит, из которого все собирается
15:12 < Lost> у него есть ассоциированное дерево
15:12 < Lost> вот из этого дерева и берется
15:12 < stanv_> diff: v@version@:postfix postfix
15:12 < stanv_> что такое второй "postfix" ?
15:13 < Lost> stanv_: diff: v@version@:postfix fixes-v@version@:postfix
15:13 < stanv_> fixes-v@version@ - я такого тега не создавал 
15:14 < vvk> stanv_: второй postfix это директория для diff-а из текущего "объекта-коммита" (ц)
15:14 < Lost> stanv_: дык а что ты хочешь задавать? дифф между чем и чем?
15:15 < stanv_> между ветками. одна ветка одно сосотояние каталога, друга - другое состояние
15:16 < stanv_> текущий "объекта-коммит" существует всегда ? даже когда я сделал clone из git.alt ?
15:16 < Lost> нельзя между ветками
15:16 < Lost> можно между тегами
15:16 < Lost> ветки сегодня одни, завтра другие
15:17 < stanv_> логично
15:17 < stanv_> а если коммиты удаляются ?
15:17 < Lost> ну тогда получается что из такого репозитория нельзя собрать пакет
15:19 < stanv_> опять думать, я вот думаю, репозиторий на git.alt он же должен быть построен так что можно было бы собрать пакет любого сторай версии и любого 
                старого релиза? 
15:19 < stanv_> а почти все репоизитории этого не позволяют :( хы-хы
15:20 < Lost> stanv_: коммиты удаляются если 1) на них нету ссылок из refs/*
15:20 < Lost> и 2) был выполнен git-prune или git-gc --prune
15:21 < Lost> насколько я знаю, на git.alt выполняется git-gc без --prune
15:21 < Lost> итого - коммиты залитые туда - удаляться не будут никогда
15:22 < stanv_> блин, фигня какая-то :( не понимаю как привязать релиз пакета к состоянию репозитория
15:23 < Lost> что тебе непонятно то?
15:32 < stanv_> это же анриал вытянуть из git.alt и сказать собирика мне пакет с alt1, когда уже состояние репозитрия на git.alt для пакета alt7
15:32 < thresh> да
15:33 < swi> stanv_: а в rpm по другому?
15:33 < stanv_> swi, конечно нет :)
15:34 < swi> ну
15:35 < thresh> можно же
15:35 < thresh> по тэгу, не?
15:35 < swi> если тег не спуржился уже
15:35 < stanv_> thresh: глобал тег ?
15:35 < Lost> stanv_: в смысле анриал?
15:35 < Lost> stanv_: как раз таки не анриал, а очень даже реально должно быть
15:35 < swi> stanv_: шо ты гонишь.. я в одном репо делал три версии пакета
15:36 < thresh>   kernel-modules-nvidia-ovz-smp: PreDepends: kernel-image-ovz-smp (= 2.6.18-alt15) but 2.6.18-alt17 is to be installed
15:36 < thresh> мля
15:36 < stanv_> а, жесть... если я попрошу показать
15:36 < stanv_> не, забейте
15:36 < stanv_> буду думать
15:36 < swi> теги и бранчи думаю тебя спасут
15:36 < Lost> stanv_: там все сделано так, чтобы можно было и старые версии собирать, и новые
15:37 < stanv_> покажи такой пакет :)
15:37 < Lost> в частности, требование мержить все теги, которые перечислены в .gear-rules, в тот коммит, из которого собирается
15:37 < Lost> stanv_: любой репо возьми
15:38 < stanv_> т.е. ты предлагаешь отслеживать лог для .spec и когда был коммит для изменения Release собирать старый пакет ?
15:39 < Lost> stanv_: нет
15:39 < Lost> я предлагаю делать теги по %version-%release
15:39 < Lost> и собирать из этих тегов
15:39 < Lost> ферштейн?
15:41 < stanv_> да
15:42 < Lost> ок
15:42 < Lost> посмотри например на мой пакет KoLmafia
15:42 < stanv_> ты Lost на git.alt ?
15:42 < Lost> http://git.altlinux.org/people/damir/packages/KoLmafia.git
15:43 < Lost> не, я damir@
15:43 < stanv_> а что такое base= ?
15:44 < Lost> это значит что тарбол будет собираться без директории верхнего уровня
15:47 < Lost> так апстрим распространяет, я не виноват
15:49 < Lost> а, кстати. я наврал что репозиторий будет несобираемым
15:49 < Lost> если коммиты удалятся
15:49 < stanv_> почему?
15:49 < Lost> они не могут удалиться, потому что они смержены в тот коммит, из которого собирается
15:50 < stanv_> т.е. неможно удалить коммит который посерединке
15:50 < Lost> да
15:51 < Lost> то есть мерж в коммит где лежат gear-rules, это гарантия того, что все теги никуда не денутся
15:52 < stanv_> АААА
15:52 < stanv_> а мерж - это еще один коммит ?
15:52 < stanv_> глобальный ?
15:53 < Lost> блин, надо уже писать новую часть git guts
15:53 < stanv_> можно в ветке кучу маленьких коммитов, потом все смержить, потом удалить все маленькие коммиты ?
15:53 < Lost> а то блин люди элементарных вещей не понимают
15:53 < Lost> stanv_: нельзя удалять коммиты
15:53 < Lost> можно лишь убрать на них все ссылки
15:53 < stanv_> даже если они смержины ?
15:53 < Lost> тогда они удалятся при вызове git-prune
15:53 < Lost> операция merge - это ссылка
15:54 < Lost> когда ты делаешь merge другого коммита, ты делаешь в своей ветке ссылку на этот коммит
15:54 < stanv_> а, понятно
15:54 < Lost> и теперь пока твоя ветка жива, тот коммит тоже будет жить
 stanv_> понял
15:55 < Lost> ну или точнее, пока на этот merge-коммит хоть кто-то еще ссылается
15:55 < hiddenman_> никто миксер не подскажет, который бы видел появляющиеся и исчезающие устройства? kmix тупой
15:55 < stanv_> и базируется на этом merge-коммите другой коммит ?
15:55 < stanv_> *или
< Lost> stanv_: ну это и есть "кто-то еще ссылается"
15:56 < Lost> да
15:56 < Lost> или тег
15:56 < Lost> или ветка
15:56 < stanv_> круто
15:58 < Lost> гит - это база объектов, связанных между собой ссылками
15:58 < Lost> к ней есть т.н. внешние ссылки
15:58 < Lost> они все лежат в .git/refs и .git/HEAD
15:59 < Lost> git-prune берет все внешние ссылки (ветки и теги) и смотрит на что они ссылаются
15:59 < sadeness_> у нас кроме Lost кто-нить в git разобрался?
15:59 < Lost> ну типа тег ссылается на коммит, коммит на дерево и другие коммиты, дерево на блобы и другие деревья
17:25 < Lost> я тебе еще больше скажу - можно сделать gitk --all -- /path/to/file чтобы посмотреть коммиты, изменяющие этот файл
13:57 < stanv_> Lost: 15:39 < Lost> я предлагаю делать теги по %version-%release
13:58 < stanv_> это на код апстрима, а на модифицированный код какой тег ставить ?
14:03 < Lost> stanv_: сам ты на код апстрима
14:04 < Lost> какой у апстрима %release?
14:04 < stanv_> а
14:04 < stanv_> точно
14:04 < Lost> я на апстрим ставлю %name-%version
14:04 < stanv_> не хочу ставить тег на ветку куда приложены патчи вида  %version-%release
14:05 < stanv_> так как release может изменится, а патчи остаться теже, не изменясь совсем
14:05 < stanv_> (тег на код с изменениями а не на ветку)
14:06 < Lost> stanv_: теги можно двигать
14:06 < stanv_> а! переименовывать ?
14:06 < Lost> переставлять на другие коммиты
14:06 < stanv_> круто
14:07 < stanv_> аффигенно
14:11 < Lost> причем если ты двигаешь "вверх по дереву" - то гит даже ругаться не будет
14:11 < Lost> просто тупо обновит
14:12 < Lost> а если переставляешь куда-то на другую ветку, то когда делаешь git-push, придется еще -f указывать.
14:12 < stanv_> и когда я буду говорить push он сдвинет все на удаленом рипозитории тоже ?
14:12 < Lost> да
14:13 < Lost> если ты говоришь push --tags
14:18 < Lost> stanv_: ну? что непонятно?
14:19 < stanv_> непонятно
14:19 < Lost> stanv_: ты забыл этот тег замержить в мастер?
14:19 < stanv_> м :(
14:19 < stanv_> дальше не понимаю
14:19 < stanv_> я создал тег
14:19 < stanv_> а что еще ?
14:20 < Lost> мержить в мастер надо
14:20 < Lost> точнее туда, где у тебя .gear-rules валяеццо
14:20 < stanv_> зачем ?
14:21 < stanv_> не понимаю зачем :(
14:23 < stanv_> так есть же тег, пока есть тег - коммиты не потеряются
14:23 < Lost> stanv_: а как только тег удалят, что будет?
14:23 < Lost> stanv_: в чем в общем проблема-то?
14:23 < stanv_> не хочу заливать ветку patches в ветку srpm
14:26 < Lost> stanv_: тебе не надо ветку srpm
14:26 < Lost> плюс еще можно git-merge -s ours
14:27 < stanv_> Lost: ну ок, можно еще и git pull -s ours . patches
14:27 < stanv_> но зачем :( ? я не понимаю, зачем ?
14:34 < Lost> stanv_: я ж тебе объяснил
14:35 < stanv_> Lost: я тег честное слово не собирался никогда удалять
14:37 < stanv_> тогда если следовать этой мысли в master должны быть состояния 1.апстрим + 2.апстрим+патчи
15:04 < Lost> stanv_: я не знаю что там у тебя в master. у меня там - запачченная по самые помидоры версия
15:05 < stanv_> а код апстрима как хранится ?
15:07 < Lost> в отдельной ветке
15:07 < Lost> и мержится в master
15:07 < stanv_> т.е. все мержится в master?
15:09 < Lost> да
15:09 < Lost> ты посмотрел KoLmafia?
15:10 < stanv_> да
15:11 < Lost> и ничего не понял, так?
15:13 < stanv_> я как понял все нужно мержить в мастер
15:13 < stanv_> только зачем не понял
15:14 < stanv_> и не понял как делать merge в мастер когда обновился апстрим... там же будет кучу нестыковок
15:14 < Lost> для того, чтобы можно было собирать старые версии
15:15 < stanv_> для старых версие есть теги
15:15 < Lost> stanv_: ты мержи upstream в patches, а потом patches в master
15:15 < Lost> stanv_: теги можно двигать, ку-ку
15:15 < stanv_> ептить, ладно понял, все, вопросов больше нету :)
15:17 < Lost> мержить в мастер надо для воспроизводимости
15:17 < Lost> вот и все
stanv_> а что означает стратегия ours при pull ?
17:08 < AMorozov> stanv_: при pull ?
17:08 < AMorozov> Не то же самое, что при merge ?
17:08 < stanv_> ну ладно, что она означает 6)
17:08 < stanv_> :)
17:08 < AMorozov> То есть, насколько я помню, pull == fetch <remote> + merge <remote>
17:09 < AMorozov> Это фэйковый, виртуальный коммит.
17:09 < Lost> stanv_: значит что ничего не меняется, но ветки оказываются смержеными
17:09 < AMorozov> То есть, сорцы не изменяются вообще, а дерево ветки как-бы мержатся, судя по истории.
17:10 < Lost> AMorozov: мержится только история, без деревьев
17:10 < AMorozov> Ну.
17:10 < AMorozov> А я чего сказал? ;-)
17:10 < stanv_> ы :( не понимаю, а где почитать можно как это происходит ? и его смысл ?
17:10 < Lost> stanv_: man git-merge
17:11 < AMorozov> stanv_: смысл - например, ты хочешь сказать, что ты смержил изменения из какой-то ветки, хотя они тебе даром не нужны :-)
17:12 < Lost> stanv_: это все нужно для манипуляции с историей
< stanv_> как посмотреть SHA1 тага ?
15:42 < Lost> git-rev-parse имя тега
< stanv_> Lost: http://paste.org.ru/?tkiafm
16:09 < stanv_> чего-то я не могу привязать тег к комиту который я хочу :(
16:11 < Lost> stanv_: ты смотришь SHA1 тега
16:11 < Lost> а не SHA1 коммита
16:11 < Lost> ку-ку :)
16:12 < Lost> если хочешь посмотреть SHA1 коммита, на который указывает тег - надо делать git-rev-parse тег^{commit}
16:12 < Lost> то есть типа так: git-rev-parse jackit-0.103.0^{commit}
16:25 < stanv_> как сказать чтобы gear-update-tag добавил SHA1 коммита а не тега ?
16:26 < Lost> stanv_: ты чего, упал чтоли?
16:26 < Lost> зачем?
16:26 < Lost> stanv_: в принципе конечно можно
16:26 < Lost> stanv_: делай git-tag без -s
16:26 < Lost> будет легкий тег, без объекта
16:27 < Lost> для него только SHA1 коммита записывается
16:27 < Lost> только такие теги нельзя на git.alt заливать
16:29 < stanv_> Lost: а что такое merge ?
16:29 < Lost> stanv_: merge - это слияние двух веток и образования т.н. merge-commit
16:29 < Lost> stanv_: родителями которого являются топ-коммиты в сливающихся ветках
16:30 < Lost> stanv_: что при этом происходит с деревьями, которые были прикреплены к каждому коммиту - зависит от стратегии слияния
16:31 < Lost> можно брать либо то дерево, либо другое
16:31 < Lost> либо как-то их комбинировать
16:31 < stanv_> а можно только чтоб в дереве были полностью модифицированные файлы ?
16:31 < Lost> а что значит "полностью модифицированные"?
16:32 < stanv_> отображение только тех файлов, которые были затронуты (которые несут отличия между ветками)
16:33 < Lost> stanv_: все равно не понял что ты хочешь получить
16:34 < Lost> stanv_: что значит "отображение"?
16:35 < stanv_> Lost: существование
16:36 < Lost> stanv_: ты в терминах деревьев объясни
16:37 < stanv_> Lost: что дерево состояло только из файлов, которые иные в ветке с которой мержили
16:37 < stanv_> не понимаю что такое merge
16:37 < stanv_> понимаю что тако патч
16:39 < evyscr> stanv_: в терминах svn: у тебя есть локальная копия файла, ты её изменил, делаешь апдейт, а файл обновился. svn попытается применить твои изменения к обновлённому файлу.
16:42 < stanv_> понимаю
16:42 < stanv_> я не понимаю в виде чего это хранится
16:42 < stanv_> раз не в дифах
16:42 < stanv_> то в чем
16:49 < Lost> stanv_: читай мой жж
16:49 < Lost> stanv_: там все понятно в чем хранится
16:49 < Lost> в деревьях хранится
16:50 < stanv_> Lost: мож дать ссылку ?
16:54 < Lost> stanv_: los-t.livejournal.com