git/gitnotes

Материал из ALT Linux Wiki
< Git
Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.
48px-Mail-mark-junk red.svg.png
Эта статья конкретно протухла.
Статья уже не подходит под современные реалии, под современные версии Альта или сломана совсем. Возможно, её уже не доработать и не поместить в архив.


Создание на 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

Если есть вопросы — обращайтесь.