git/gitnotes
Создание на git.alt репозитория пакета
Цель: создать на git.alt репозиторий пакета
- Создаем локальный репозиторий
$ mkdir package.git
$ cd package.git
$ git init
- Создаем пустой файл. Для создания первого commit репозиторий должен быть не пустой.
$ touch .empty
- Создаем первый коммит
$ git add .
$ git commit -m "Initial commit"
- Создаем ветку для исходного кода разработчика. Заносим исходный код программы от разработчика в репозиторий.
$ git checkout -b upstream
$ cp ~/tmp/opensc-0.11.4.tar.gz ./
$ tar zxvf opensc-0.11.4.tar.gz
$ mv opensc-0.11.4 opensc
$ rm opensc-0.11.4.tar.gz
$ find opensc -type d -empty
opensc/doc/api/*
$ touch opensc/doc/api/*/.directory_holder_git
или $ find libopensync/ -type d -empty -exec touch '{}/.directory_holder_git' \;
$ git add .
$ git commit -m "Upstream tree import."
- Создаем аннотированный тег с GPG подписью. Имя тега выставляем согласно релизу исходного когда разработчика.
$ git tag -m 'upstream 0.11.4' -s opensc-0.11.4 0ed04a782a89f01227f732be93edf85772d4d2c6
- Создаем ветку отображающую исходный код пакета. Модифицированный исходный код, содержащий патчи, исправление ошибок, итп. Каждый коммит отображает патч.
$ git checkout -b patches
$ stg init
$ stg new -m "opensc-0.11.4.rutoken-0.1.0.diff" opensc-0.11.4.rutoken-0.1.0.diff
(приложить вручную патч patch -p1 --no-backup-if-mismatch < ../opensc-0.11.4.rutoken-test1.diff)
$ stg refresh
(посмотреть не создает ли патч новых файлов\каталогов (stg status) если есть такие добавить их (stg add opensc && stg refresh) )
$ stg commit
- Заносим полученное дерево исходных кодов в ветку master.
$ git checkout master
$ git pull -s ours . patches
- Копируем необходимые файлы в репозиторий в ветку master:
- opensc.spec - спек файл указывает как собирать пакет
- readme.alt - замечание как собран этот пакет
- .gear-rules - указание gear как собирать srpm пакет
- Добавляем аннотированный тег с GPG подписью на модифицированное дерево исходных кодов для %Release. Если дерево не изменилось тег можно передвинуть.
$ git tag -m 'patches for 0.11.4-alt1' -s 0.11.4-alt1 6696acb85daba30649343ab6a37950726d77f647
- Пытаемся собрать пакет
$ git add .gear-rules
$ git add opensc.spec
$ git add readme.alt
$ gear-update-tag --all
$ gear --commit --rpmbuild -- rpm -ba
- Отдельный интерес может представлять файл .gear-rules. Вот его содержимое:
copy: readme.alt
diff: @name@-@version@:opensc @version@-@release@:opensc name=@name@-@version@-@release@-super.patch
tar: @name@-@version@:opensc name=@name@-@version@
- Удаляем мусор, и отправляем репозиторий на git.alt
$ git commit -a -m "Package opensc-0.11.4-alt1"
$ git repack -a -d
$ git push --all git.alt:/people/stanv/packages/opensc_current.git
$ git push --tags git.alt:/people/stanv/packages/opensc_current.git
Обновляем пакет
Допустим апстрим выпустил новую версию продукта.
- Скачаем со свеого репозитория старую версию:
$ git clone git.alt:/people/stanv/packages/openct_current.git
$ cd openct_current
- Создадим ветку upstrem на основе оригинальной и перейдем в нее.
$ git checkout -b upstream origin/upstream
- Обновляем до апстрима
$ gear-update
Заметки
13:29 < Lost> ну посмотри, есть ли реально этот файл в дереве 13:29 < Lost> git ls-tree HEAD 13:40 < stanv> а как удалит все файлы которые не занесены в репозиторий? 13:41 < wRAR> git clean
15:11 < Lost> stanv: а зачем там этот .empty? 15:17 < stanv> Lost: я не могу создать ветку пока нету initial commit 15:17 < Lost> stanv: можно прям сразу делать то, что ты хотел делать в ветке upstream, в ветке master 15:17 < Lost> stanv: чувак, ветки можно переименовывать, удалять, добавлять 15:18 < stanv> Lost: хочу чтобы ветка master содержала только spec .gear-rules и %Source{N} к пакету 15:19 < Lost> stanv: это делается по-другому 15:20 < stanv> Lost: Как ? 15:20 < Lost> stanv: делаешь временную директорию рядом 15:21 < Lost> stanv: делаешь там git init 15:21 < Lost> stanv: добавляешь спек и .gear-rules 15:21 < Lost> делаешь git add, git commit 15:21 < Lost> получаешь там ветку master 15:21 < Lost> потом идешь в свой репо. удаляешь там ветку master и делаешь git pull ../temp master:master 15:22 < Lost> и того - у тебя в репо есть два корневых коммита 15:22 < Lost> первый - апстрим. второй - master 15:29 < Lost> stanv: чтобы у тебя были две совершенно не связанные друг с другом ветки 15:33 < stanv> Lost: а первый коммит что собой будет представлять ? 15:39 < Lost> stanv: там два первых коммита будет 15:40 < stanv> Lost: ок, что собой представляет первый коммит No1 15:40 < stanv> ? 15:40 < stanv> upstream ? 15:40 < Lost> дерево исходников upstream 15:40 < Lost> второй корневой коммит - дерево со спеком и .gear-rules 15:41 < stanv> Lost: всеравно потом надо будет говорить в ветке master: git pull -s ours . patches 15:42 < Lost> stanv: и что? 15:43 < stanv> Lost: ничего :) 15:46 < Lost> stanv: в чем проблема то? 15:46 < Lost> stanv: ты сделал фиктивные два корня, за счет этого самого .emptyfile
git.alt from raorn
Задача
Я узнал что у меня есть огромная семья... Кто-то нашептал, что в git лежит новая сборка пакета N. У меня есть дополнения к этому пакету. Хотелось бы склонировать чужой git-репозиторий, внести правки и отослать это мантейнеру. Как?
Далее пакет N == ocsinventory-server
Поиск git-репозитория на git.alt
ssh git.alt find-package ocsinventory-server
/people/raorn/packages/ocsinventory-server.git
Создание клона репозитория на git.alt
Теперь я создам себе клон raorn'овского репозитория на git.alt
ssh git.alt clone /people/raorn/packages/ocsinventory-server ocsinventory-server
Проверяю
ssh git.alt ls /people/barabashka/packages/ocsinventory-server.git
total 20
-rw-r--r-- 1 23 Apr 14 19:36 HEAD
-rw-r--r-- 1 66 Apr 14 19:36 config
-rw-r--r-- 1 29 Apr 14 19:36 description
-rw------- 1 0 Apr 14 19:36 git-daemon-export-ok
lrwxrwxrwx 1 22 Apr 14 19:36 hooks -> /usr/share/girar/hooks
drwxr-sr-x 4 4096 Apr 14 18:00 objects
drwxr-sr-x 4 4096 Apr 14 19:36 refs
Получение git-репозитория на локальную машину с git.alt
git clone git.alt:/people/barabashka/packages/ocsinventory-server.git
Initialized empty Git repository in /home/lsv/Projects/OCS/ocsinventory-server/.git/
remote: Generating pack...
remote: Done counting 3384 objects.
remote: Deltifying 3384 objects...
remote: 100% (3384/3384) done
remote: Total 3384 (delta 2377), reused 3384 (delta 2377)
Receiving objects: 100% (3384/3384), 11.24 MiB | 661 KiB/s, done.
Надо заметить, что я клонирую с git.alt не raorn'овский, а свой. Чтобы original-refs смотрели на мой репозиторий, а не на raorn'овский.
Подключение удаленного репозитория с git.alt
Теперь подключаю raorn'овский репозиторий как удаленный к себе на локальную машину
git remote add alt-raorn-ocs git.alt:/people/raorn/packages/ocsinventory-server.git
Получение удаленного репозитория raorn'а
git fetch alt-raorn-ocs
From git.alt:/people/raorn/packages/ocsinventory-server
* [new branch] master -> alt-raorn-ocs/master
* [new branch] stable_1_0_1 -> alt-raorn-ocs/stable_1_0_1
Синхронизация branch'ей
git fetch alt-raorn-ocs 'refs/heads/*:refs/heads/*'
From git.alt:/people/raorn/packages/ocsinventory-server
* [new branch] stable_1_0_1 -> stable_1_0_1
* [new branch] upstream -> upstream
Если ругнётся так:
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
— следует сперва git checkout бранч, имя которого не совпадает с имеющимися в склонированном репозитории (см. тж. git branch -r. Или не злоупотреблять тотальной синхронизацией.
Итого
git status
# On branch master
nothing to commit (working directory clean)
git branch
* master
stable_1_0_1
upstream
git branch -r
alt-raorn-ocs/master
alt-raorn-ocs/stable_1_0_1
alt-raorn-ocs/upstream
origin/HEAD
origin/master
origin/stable_1_0_1
origin/upstream
Внесение изменений и отправка изменений к себе на git.alt
Далее вносятся изменения в локальные файлы, все это дело commit'ется.
Теперь можно отправлять их к себе в git-репозиторий на git.alt
git push
Counting objects: 13, done.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 1.99 KiB, done.
Total 8 (delta 6), reused 0 (delta 0)
girar-update: email notification about `refs/heads/master' update sent.
refs/heads/master: 742e85f3e1ace767197aa3b8bc9a7a1fd09bdc13 -> 99721cfb940326175087a5100ff61463cf8b06ba
To git.alt:/people/barabashka/packages/ocsinventory-server.git
742e85f..99721cf master -> master
Pack pack-1e0859e3d4c1c011cef2f2a9e8222d1e136c84df created.
Removing unused objects 100%...
Done.
UPDATE PACKAGE .alt4->.alt5 (new patch)
$ git checkout -b patches origin/patches $ stg init $ stg uncommit opensc_patch -n 2 (opensc_patch - префикс для патчей) $ stg applied opensc_patch1 opensc_patch2 $ stg series + opensc_patch1 > opensc_patch2 $ stg delete $ stg new -m "opensc-0.11.4-0.11.4.rutoken-0.3.2.diff" rutoken Копируем новый патч:
$ cp /RPM/opensc/SOURCES/opensc-0.11.4-0.11.4.rutoken-0.3.2.diff opensc/ $ cd opensc/ $ stg import opensc-0.11.4-0.11.4.rutoken-0.3.2.diff $ stg status $stg refresh -m "opensc-0.11.4-0.11.4.rutoken-0.3.2.diff" (применим патч как коммит для git) $ git-checkout master $ git-pull -s ours . patches $ vim opensc.spec $ gear-update-tag --all $ gear --commit --rpmbuild -- rpm -ba $ git-repack -a -d $ git-push --all git.alt:/people/stanv/packages/opensc_current.git $ git-push --tags git.alt:/people/stanv/packages/opensc_current.git готово
Happy end
http://www.freesource.info/wiki/BranchInGit
Если есть вопросы — обращайтесь.