Участник:Stanv/Gitsvn
Материал из ALT Linux Wiki
м («Gitsvn» переименована в «Участник:Stanv/Gitsvn») |
Stanv (обсуждение | вклад) |
||
(3 промежуточные версии не показаны) | |||
Строка 1: | Строка 1: | ||
- | + | {{Stub}} | |
+ | == git-svn(1) и git.alt == | ||
- | + | Рассмотрим на примере полный цикл сопровождения пакета для ALT Linux. | |
- | + | Причём, главной особенностью будет то, что разработчик предоставляет | |
- | + | полную историю разработки своего продукта в SVN (Subversion) репозитарии. | |
- | + | ||
- | + | ||
- | + | Припустим до вас пакет никто не создавал. | |
+ | Создадим пустой каталог для будущего GIT-репозитария: | ||
+ | <source lang="bash"> | ||
$ mkdir krb5ticketwatch | $ mkdir krb5ticketwatch | ||
$ cd krb5ticketwatch | $ cd krb5ticketwatch | ||
+ | </source> | ||
- | + | Создадим пустой репозиторий: | |
- | + | <source lang="bash"> | |
+ | $ git svn init --stdlayout https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch | ||
+ | Initialized empty Git repository in /home/stanv/tmp/krb5ticketwatch/.git/ | ||
+ | </source> | ||
- | + | Вытягиваем из SVN рапозитария всю историю: | |
+ | <source lang="bash"> | ||
+ | $ git svn fetch | ||
+ | </source> | ||
+ | |||
+ | Посмотрим что содержит working tree: | ||
+ | <source lang="bash"> | ||
+ | $ l | ||
+ | итого 16 | ||
+ | drwxr-xr-x 4 stanv stanv 43 Мар 20 13:20 ./ | ||
+ | drwxr-xr-x 9 stanv stanv 144 Мар 20 13:16 .git/ | ||
+ | drwxr-xr-x 5 stanv stanv 4096 Мар 20 13:16 krb5-ticket-watcher/ | ||
+ | drwx------ 79 stanv stanv 8192 Мар 20 13:05 ../ | ||
+ | </source> | ||
+ | |||
+ | git-svn создал metadata | ||
+ | |||
+ | $ git branch -a | ||
+ | * master | ||
+ | tags/trunk-krb5-ticket-watcher-0.1.1 | ||
+ | tags/trunk-krb5-ticket-watcher-0.1.1@12 | ||
+ | tags/trunk-krb5-ticket-watcher-0.1.2 | ||
+ | tags/trunk-krb5-ticket-watcher-0.1.2@24 | ||
+ | tags/trunk-krb5-ticket-watcher-0.1.3 | ||
+ | tags/trunk-krb5-ticket-watcher-0.1.3@40 | ||
+ | tags/trunk-krb5-ticket-watcher-0.1.3@43 | ||
+ | tags/trunk-krb5-ticket-watcher-0.2.0 | ||
+ | trunk | ||
- | |||
- | |||
- | + | На данном этапе, ветка master соответствует trunk из SVN. | |
- | + | ||
- | + | ||
- | + | ||
- | |||
$ git log -1 | $ git log -1 | ||
commit 217088707bda6e1334d773aab2290f9bd4275a01 | commit 217088707bda6e1334d773aab2290f9bd4275a01 | ||
Строка 32: | Строка 58: | ||
version 1.0.1 -- minor text change | version 1.0.1 -- minor text change | ||
- | + | ||
git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@87 a89c6a6b-391f-0410-b44d-9b669724f1e5 | git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@87 a89c6a6b-391f-0410-b44d-9b669724f1e5 | ||
+ | |||
+ | |||
+ | Собираем пакет. | ||
+ | |||
+ | Создавать ветку upstream нету необходимости, так как ей соответствует ветка trunk. | ||
+ | |||
+ | Необходимо найти коммит, который будет соответствовать последнему стабильному релизу. | ||
+ | |||
+ | commit 217088707bda6e1334d773aab2290f9bd4275a01 | ||
+ | Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5> | ||
+ | Date: Fri Sep 5 10:17:28 2008 +0000 | ||
+ | |||
+ | version 1.0.1 -- minor text change | ||
+ | |||
+ | Для этого коммита создадим GPG-signed tag, для последнего стабильного релиза: | ||
+ | |||
+ | $ git tag -s -m "v1.0.1" v1.0.1 217088707bda6e1334d7 | ||
+ | |||
+ | |||
+ | Необходим пароль для доступа к секретному ключу пользователя: "Andriy Stepanov (ALT Linux packages sign key) <stanv@altlinux.ru>" | ||
+ | 1024-бит DSA ключ, ID 289196AA, создан 2007-02-07 | ||
+ | |||
+ | (на git.alt может содержать только GPG-signed tag, обычные теги передаваться не будут). | ||
+ | |||
+ | Убедимся что тэг создан. | ||
+ | $ git tag | ||
+ | v1.0.1 | ||
+ | |||
+ | Создаем SPEC файл, который будет описывать сборку пакета: | ||
+ | $ vim krb5-ticket-watcher.spec | ||
+ | |||
+ | Добавим Changelog: | ||
+ | $ add_changelog krb5-ticket-watcher.spec | ||
+ | |||
+ | В ALT Linux пакеты сопровождаются с помощью GEAR(1). | ||
+ | |||
+ | Создадим каталок для конфигурационных файлов GEAR(1). | ||
+ | $ mkdir .gear | ||
+ | |||
+ | Зададим правила по которым GEAR будет собирать SRPM пакет: | ||
+ | $ cat .gear/rules | ||
+ | tar: v@version@:krb5-ticket-watcher | ||
+ | |||
+ | Здесь указано: | ||
+ | * положить в SRPM пакет tar-архив. | ||
+ | * tar-архив должен содержать каталог krb5-ticket-watcher | ||
+ | * каталог krb5-ticket-watcher взять из коммита, на который сылается тег: v@version@ | ||
+ | * В будущем, при создании SRPM пакета, макрос v@version@ будет раскрыт с помощью строки Version из SPEC файла. | ||
+ | |||
+ | GEAR(1) ведет свою базу тегов, в этой базе должны быть теги, которые упоминаются в .gear/rules | ||
+ | |||
+ | Создадим gear-теги: | ||
+ | $ gear-update-tag -a | ||
+ | |||
+ | $ cat .gear/tags/list | ||
+ | 74ce64fc236a219f8776db20c8e9711810fc8a4c v1.0.1 | ||
+ | |||
+ | $ git add krb5-ticket-watcher.spec | ||
+ | $ git add .gear/ | ||
+ | |||
+ | Пытаемся собрать пакет с помощью следующей команды, до тех пор пока он не будет успешно собран: | ||
+ | $ gear-rpm -bp --commit | ||
+ | |||
+ | $ git status | ||
+ | # On branch master | ||
+ | # Changes to be committed: | ||
+ | # (use "git reset HEAD <file>..." to unstage) | ||
+ | # | ||
+ | # new file: .gear/rules | ||
+ | # new file: .gear/tags/3857538d0b8776183bdedc526bbb68d08e6906f6 | ||
+ | # new file: .gear/tags/list | ||
+ | # new file: krb5-ticket-watcher.spec | ||
+ | # | ||
+ | |||
+ | Сделаем коммит, который будет соответствовать некому пакету: | ||
+ | |||
+ | $ gear-commit --spec=krb5-ticket-watcher.spec | ||
+ | |||
+ | $ git log -1 | ||
+ | commit 8c15ac713e8fed7985597a6dc82b4cd9f23b762b | ||
+ | Author: Andriy Stepanov <stanv@altlinux.ru> | ||
+ | Date: Thu Mar 19 19:48:51 2009 +0300 | ||
+ | |||
+ | 1.0.1-alt1 | ||
+ | |||
+ | - Initial import to Sisyphus | ||
+ | |||
+ | |||
+ | Также, необходимо создать тег который бы идентифицировал версию + релиз нашего пакета: | ||
+ | |||
+ | $ gear-create-tag | ||
+ | |||
+ | Необходим пароль для доступа к секретному ключу пользователя: "Andriy Stepanov (ALT Linux packages sign key) <stanv@altlinux.ru>" | ||
+ | 1024-бит DSA ключ, ID 289196AA, создан 2007-02-07 | ||
+ | |||
+ | [stanv@stanv krb5ticketwatch]$ git tag | ||
+ | 1.0.1-alt1 | ||
+ | v1.0.1 | ||
+ | |||
+ | Отправляем пакет на git.alt. | ||
+ | |||
+ | $ cat ~/.ssh/config | ||
+ | ForwardX11Trusted yes | ||
+ | Host git.alt | ||
+ | HostName git.altlinux.org | ||
+ | Port 222 | ||
+ | User git_stanv | ||
+ | |||
+ | $ ssh-add | ||
+ | Enter passphrase for /home/stanv/.ssh/id_dsa: | ||
+ | Identity added: /home/stanv/.ssh/id_dsa (/home/stanv/.ssh/id_dsa) | ||
+ | |||
+ | Создадим репозитарий на git.alt для нашего нового пакета: | ||
+ | |||
+ | $ ssh git.alt init-db krb5-ticket-watcher | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | girar-init-db: /people/stanv/packages/krb5-ticket-watcher.git | ||
+ | |||
+ | |||
+ | Способ 1 (самый простой). | ||
+ | |||
+ | Могут повылазить всякие косяки, при не аккуратных и необдуманых поступках. | ||
+ | |||
+ | Способ 1 заключается в том чтобы отправить на git.alt remotes-ветки один к одному. | ||
+ | |||
+ | Единственный недостаток заключается в том, что браузер репозитория на git.alt | ||
+ | не будет нам показывать remotes ветки. т.е. О них мы знаем, и не должны забывать. | ||
+ | git-clone не забирает их себе. | ||
+ | |||
+ | Пора отправить на git.alt наше чудище, подготовимся к этому. | ||
+ | $ git config --add remote.git-alt.url 'git.alt:/' | ||
+ | |||
+ | $ git config --add remote.git-alt.push '+refs/heads/*:refs/heads/*' | ||
+ | Что аналогично $ git push --all git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | |||
+ | $ git config --add remote.git-alt.push '+refs/tags/*:refs/tags/*' | ||
+ | Что аналогично git push --tagsl git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | |||
+ | $ git config --add remote.git-alt.push '+refs/remotes/*:refs/remotes/*' | ||
+ | Та самая волшебная строка. | ||
+ | |||
+ | После если мы посмотрим в .git/config, должны увидеть что-то типа: | ||
+ | |||
+ | [remote "git-alt"] | ||
+ | push = +refs/remotes/*:refs/remotes/* | ||
+ | push = +refs/tags/*:refs/tags/* | ||
+ | push = +refs/heads/*:refs/heads/* | ||
+ | url = git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | |||
+ | Теперь одной командой мы отправим наш репозитарий на git.alt: | ||
+ | |||
+ | $ git push git-alt | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | Counting objects: 587, done. | ||
+ | Compressing objects: 100% (505/505), done. | ||
+ | Writing objects: 100% (587/587), 165.01 KiB, done. | ||
+ | Total 587 (delta 417), reused 0 (delta 0) | ||
+ | To git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | * [new branch] master -> master | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.1 -> tags/trunk-krb5-ticket-watcher-0.1.1 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.1@12 -> tags/trunk-krb5-ticket-watcher-0.1.1@12 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2 -> tags/trunk-krb5-ticket-watcher-0.1.2 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2@24 -> tags/trunk-krb5-ticket-watcher-0.1.2@24 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3 -> tags/trunk-krb5-ticket-watcher-0.1.3 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@40 -> tags/trunk-krb5-ticket-watcher-0.1.3@40 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@43 -> tags/trunk-krb5-ticket-watcher-0.1.3@43 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.2.0 -> tags/trunk-krb5-ticket-watcher-0.2.0 | ||
+ | * [new branch] trunk -> trunk | ||
+ | * [new tag] 1.0.1-alt1 -> 1.0.1-alt1 | ||
+ | * [new tag] v1.0.1 -> v1.0.1 | ||
+ | girar-sendmail: email notification about `refs/heads/master' update sent. | ||
+ | girar-sendmail: email notification about `refs/tags/1.0.1-alt1' update sent. | ||
+ | girar-sendmail: email notification about `refs/tags/v1.0.1' update sent. | ||
+ | Repacking repository... done | ||
+ | |||
+ | $ ssh git.alt build /people/stanv/packages/krb5-ticket-watcher.git 1.0.1-alt1 | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | new task #2946: owner=stanv repo=sisyphus | ||
+ | task #2946: added #1: build tag 1.0.1-alt1 from /people/stanv/packages/krb5-ticket-watcher.git | ||
+ | task #2946: queued, result will be emailed to stanv@altlinux.org | ||
+ | |||
+ | $ ssh git.alt task ls | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | #2946 AWAITING sisyphus krb5-ticket-watcher.git=1.0.1-alt1 | ||
+ | |||
+ | |||
+ | Пришло время обновить пакет: | ||
+ | |||
+ | $ git clone git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | Initialized empty Git repository in /home/stanv/tmp/krb5-ticket-watcher/.git/ | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | remote: Counting objects: 587, done. | ||
+ | remote: Compressing objects: 100% (88/88), done. | ||
+ | remote: Total 587 (delta 417), reused 587 (delta 417) | ||
+ | Receiving objects: 100% (587/587), 157.75 KiB, done. | ||
+ | Resolving deltas: 100% (417/417), done. | ||
+ | |||
+ | $ cd krb5-ticket-watcher | ||
+ | |||
+ | $ git branch -a | ||
+ | * master | ||
+ | origin/HEAD | ||
+ | origin/master | ||
+ | |||
+ | $ git svn init --stdlayout https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch | ||
+ | $ git config --add remote.origin.fetch '+refs/remotes/*:refs/remotes/*' | ||
+ | |||
+ | |||
+ | [remote "origin"] | ||
+ | url = git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | fetch = +refs/heads/*:refs/remotes/origin/* | ||
+ | fetch = +refs/remotes/*:refs/remotes/* | ||
+ | |||
+ | $ git fetch | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | From git.alt:/people/stanv/packages/krb5-ticket-watcher | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.1 -> tags/trunk-krb5-ticket-watcher-0.1.1 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.1@12 -> tags/trunk-krb5-ticket-watcher-0.1.1@12 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2 -> tags/trunk-krb5-ticket-watcher-0.1.2 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2@24 -> tags/trunk-krb5-ticket-watcher-0.1.2@24 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3 -> tags/trunk-krb5-ticket-watcher-0.1.3 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@40 -> tags/trunk-krb5-ticket-watcher-0.1.3@40 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@43 -> tags/trunk-krb5-ticket-watcher-0.1.3@43 | ||
+ | * [new branch] tags/trunk-krb5-ticket-watcher-0.2.0 -> tags/trunk-krb5-ticket-watcher-0.2.0 | ||
+ | * [new branch] trunk -> trunk | ||
+ | |||
$ git branch -a | $ git branch -a | ||
* master | * master | ||
+ | origin/HEAD | ||
+ | origin/master | ||
tags/trunk-krb5-ticket-watcher-0.1.1 | tags/trunk-krb5-ticket-watcher-0.1.1 | ||
tags/trunk-krb5-ticket-watcher-0.1.1@12 | tags/trunk-krb5-ticket-watcher-0.1.1@12 | ||
Строка 47: | Строка 301: | ||
trunk | trunk | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | + | $ git log -1 remotes/trunk | |
+ | commit 217088707bda6e1334d773aab2290f9bd4275a01 | ||
+ | Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5> | ||
+ | Date: Fri Sep 5 10:17:28 2008 +0000 | ||
- | + | version 1.0.1 -- minor text change | |
- | + | ||
- | + | git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@87 a89c6a6b-391f-0410-b44d-9b669724f1e5 | |
- | + | ||
- | |||
+ | $ git svn fetch | ||
- | commit | + | $ git log -1 remotes/trunk |
+ | commit 9d1d6507fa85f60ca72e9a4f4725caf0ac93823e | ||
Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5> | Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5> | ||
- | Date: | + | Date: Mon Mar 16 09:40:32 2009 +0000 |
- | version 1.0. | + | version 1.0.2 |
+ | |||
+ | git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@90 a89c6a6b-391f-0410-b44d-9b669724f1e5 | ||
- | $ git tag -s -m | + | Операция заняла не более одной минуты. Что .... |
+ | |||
+ | Создадим пакет на основе новой стабильной версии: | ||
+ | $ git log trunk | ||
+ | Например меня можно найти ее можно найти с помощью: | ||
+ | $ git log trunk | ||
+ | |||
+ | Мы находимся в локальной ветке master:: | ||
+ | $ git branch | ||
+ | * master | ||
+ | |||
+ | Обновим ветку master до новой версии: | ||
+ | $ git tag -s -m 'v1.0.2' v1.0.2 9d1d6507fa85f60ca7 | ||
Необходим пароль для доступа к секретному ключу пользователя: "Andriy Stepanov (ALT Linux packages sign key) <stanv@altlinux.ru>" | Необходим пароль для доступа к секретному ключу пользователя: "Andriy Stepanov (ALT Linux packages sign key) <stanv@altlinux.ru>" | ||
1024-бит DSA ключ, ID 289196AA, создан 2007-02-07 | 1024-бит DSA ключ, ID 289196AA, создан 2007-02-07 | ||
- | + | $ git tag | |
+ | 1.0.1-alt1 | ||
v1.0.1 | v1.0.1 | ||
+ | v1.0.2 | ||
+ | |||
+ | $ git merge v1.0.2 | ||
$ gear-update-tag -a | $ gear-update-tag -a | ||
$ cat .gear/tags/list | $ cat .gear/tags/list | ||
- | + | 1006394f8ce60c88ba780600a3512424b0c39912 v1.0.2 | |
- | + | $ add_changelog krb5-ticket-watcher.spec | |
- | + | $ git add add_changelog krb5-ticket-watcher.spec | |
- | $ gear-rpm - | + | (Можете использовать gear-changelog, прежде прочитав manpage GEAR-CHNAGELOG-RULES(5) ) |
+ | |||
+ | Пытаемя собрать пакет: | ||
+ | $ gear-rpm --commit --bb | ||
+ | |||
+ | Если собралось можем делать коммит: | ||
+ | |||
+ | $ gear-commit | ||
+ | |||
+ | $ git config --add remote.origin.push '+refs/remotes/*:refs/remotes/*' | ||
+ | |||
+ | Отправим локальные ветки | ||
+ | |||
+ | $ git push --all | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | Counting objects: 84, done. | ||
+ | Compressing objects: 100% (65/65), done. | ||
+ | Writing objects: 100% (69/69), 47.55 KiB, done. | ||
+ | Total 69 (delta 56), reused 0 (delta 0) | ||
+ | To git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | 8c15ac7..1a951cf master -> master | ||
+ | girar-sendmail: email notification about `refs/heads/master' update sent. | ||
+ | Repacking repository... done | ||
+ | |||
+ | И все прочее (срабатывают правила push из .git/config): | ||
+ | [stanv@stanv krb5-ticket-watcher]$ git push | ||
+ | RSA host key for IP address '194.107.17.12' not in list of known hosts. | ||
+ | Counting objects: 1, done. | ||
+ | Writing objects: 100% (1/1), 310 bytes, done. | ||
+ | Total 1 (delta 0), reused 0 (delta 0) | ||
+ | To git.alt:/people/stanv/packages/krb5-ticket-watcher.git | ||
+ | 2170887..9d1d650 trunk -> trunk | ||
+ | * [new branch] origin/HEAD -> origin/HEAD | ||
+ | * [new branch] origin/master -> origin/master | ||
+ | * [new tag] v1.0.2 -> v1.0.2 | ||
+ | girar-sendmail: email notification about `refs/tags/v1.0.2' update sent. | ||
+ | Repacking repository... done | ||
+ | |||
+ | Вышеизложенный материал не претендует на правильность, корректность, оффициальность, и как единственный правильный способ. | ||
+ | |||
+ | Следует учитывать что разработчик может удалять из своего SVN репозитария tags & branches, | ||
+ | Т.е. могут существовать в git репозитарии которые тоже необходимо будет удалять из git-репозитария. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | $ find .git/refs/remotes/ | ||
+ | .git/refs/remotes/ | ||
+ | .git/refs/remotes/trunk | ||
+ | .git/refs/remotes/tags | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.1@12 | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.1 | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.2@24 | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.2 | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.3@40 | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.3 | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.3@43 | ||
+ | .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.2.0 | ||
+ | |||
+ | $ find .git/refs/heads/ | ||
+ | .git/refs/heads/ | ||
+ | .git/refs/heads/master | ||
+ | .git/refs/heads/upstream | ||
+ | |||
+ | |||
+ | Способ №2 | ||
+ | Вариация Способа №1, но без закидывания на git.alt remotes веток. | ||
+ | |||
+ | Ошибки которых следует избегать: | ||
+ | |||
+ | При создании локального git репозитария у себя на рабочем компьютере, не называйте его с суффиксом .git | ||
+ | Суффикс .git - означает что репозиторий является bare, т.е. не содержит копию исходных кодов. | ||
+ | Bare репозиторий не имеет WORKING TREE, а содержит только базу данных git. |
Текущая версия на 14:30, 23 марта 2009
git-svn(1) и git.alt
Рассмотрим на примере полный цикл сопровождения пакета для ALT Linux. Причём, главной особенностью будет то, что разработчик предоставляет полную историю разработки своего продукта в SVN (Subversion) репозитарии.
Припустим до вас пакет никто не создавал.
Создадим пустой каталог для будущего GIT-репозитария:
$ mkdir krb5ticketwatch $ cd krb5ticketwatch
Создадим пустой репозиторий:
$ git svn init --stdlayout https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch Initialized empty Git repository in /home/stanv/tmp/krb5ticketwatch/.git/
Вытягиваем из SVN рапозитария всю историю:
$ git svn fetch
Посмотрим что содержит working tree:
$ l итого 16 drwxr-xr-x 4 stanv stanv 43 Мар 20 13:20 ./ drwxr-xr-x 9 stanv stanv 144 Мар 20 13:16 .git/ drwxr-xr-x 5 stanv stanv 4096 Мар 20 13:16 krb5-ticket-watcher/ drwx------ 79 stanv stanv 8192 Мар 20 13:05 ../
git-svn создал metadata
$ git branch -a
- master
tags/trunk-krb5-ticket-watcher-0.1.1 tags/trunk-krb5-ticket-watcher-0.1.1@12 tags/trunk-krb5-ticket-watcher-0.1.2 tags/trunk-krb5-ticket-watcher-0.1.2@24 tags/trunk-krb5-ticket-watcher-0.1.3 tags/trunk-krb5-ticket-watcher-0.1.3@40 tags/trunk-krb5-ticket-watcher-0.1.3@43 tags/trunk-krb5-ticket-watcher-0.2.0 trunk
На данном этапе, ветка master соответствует trunk из SVN.
$ git log -1 commit 217088707bda6e1334d773aab2290f9bd4275a01 Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5> Date: Fri Sep 5 10:17:28 2008 +0000
version 1.0.1 -- minor text change
git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@87 a89c6a6b-391f-0410-b44d-9b669724f1e5
Собираем пакет.
Создавать ветку upstream нету необходимости, так как ей соответствует ветка trunk.
Необходимо найти коммит, который будет соответствовать последнему стабильному релизу.
commit 217088707bda6e1334d773aab2290f9bd4275a01 Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5> Date: Fri Sep 5 10:17:28 2008 +0000
version 1.0.1 -- minor text change
Для этого коммита создадим GPG-signed tag, для последнего стабильного релиза:
$ git tag -s -m "v1.0.1" v1.0.1 217088707bda6e1334d7
Необходим пароль для доступа к секретному ключу пользователя: "Andriy Stepanov (ALT Linux packages sign key) <stanv@altlinux.ru>"
1024-бит DSA ключ, ID 289196AA, создан 2007-02-07
(на git.alt может содержать только GPG-signed tag, обычные теги передаваться не будут).
Убедимся что тэг создан. $ git tag v1.0.1
Создаем SPEC файл, который будет описывать сборку пакета: $ vim krb5-ticket-watcher.spec
Добавим Changelog: $ add_changelog krb5-ticket-watcher.spec
В ALT Linux пакеты сопровождаются с помощью GEAR(1).
Создадим каталок для конфигурационных файлов GEAR(1). $ mkdir .gear
Зададим правила по которым GEAR будет собирать SRPM пакет: $ cat .gear/rules tar: v@version@:krb5-ticket-watcher
Здесь указано:
- положить в SRPM пакет tar-архив.
- tar-архив должен содержать каталог krb5-ticket-watcher
- каталог krb5-ticket-watcher взять из коммита, на который сылается тег: v@version@
- В будущем, при создании SRPM пакета, макрос v@version@ будет раскрыт с помощью строки Version из SPEC файла.
GEAR(1) ведет свою базу тегов, в этой базе должны быть теги, которые упоминаются в .gear/rules
Создадим gear-теги: $ gear-update-tag -a
$ cat .gear/tags/list 74ce64fc236a219f8776db20c8e9711810fc8a4c v1.0.1
$ git add krb5-ticket-watcher.spec $ git add .gear/
Пытаемся собрать пакет с помощью следующей команды, до тех пор пока он не будет успешно собран: $ gear-rpm -bp --commit
$ git status
- On branch master
- Changes to be committed:
- (use "git reset HEAD <file>..." to unstage)
- new file: .gear/rules
- new file: .gear/tags/3857538d0b8776183bdedc526bbb68d08e6906f6
- new file: .gear/tags/list
- new file: krb5-ticket-watcher.spec
Сделаем коммит, который будет соответствовать некому пакету:
$ gear-commit --spec=krb5-ticket-watcher.spec
$ git log -1 commit 8c15ac713e8fed7985597a6dc82b4cd9f23b762b Author: Andriy Stepanov <stanv@altlinux.ru> Date: Thu Mar 19 19:48:51 2009 +0300
1.0.1-alt1 - Initial import to Sisyphus
Также, необходимо создать тег который бы идентифицировал версию + релиз нашего пакета:
$ gear-create-tag
Необходим пароль для доступа к секретному ключу пользователя: "Andriy Stepanov (ALT Linux packages sign key) <stanv@altlinux.ru>" 1024-бит DSA ключ, ID 289196AA, создан 2007-02-07
[stanv@stanv krb5ticketwatch]$ git tag 1.0.1-alt1 v1.0.1
Отправляем пакет на git.alt.
$ cat ~/.ssh/config ForwardX11Trusted yes Host git.alt
HostName git.altlinux.org Port 222 User git_stanv
$ ssh-add Enter passphrase for /home/stanv/.ssh/id_dsa: Identity added: /home/stanv/.ssh/id_dsa (/home/stanv/.ssh/id_dsa)
Создадим репозитарий на git.alt для нашего нового пакета:
$ ssh git.alt init-db krb5-ticket-watcher RSA host key for IP address '194.107.17.12' not in list of known hosts. girar-init-db: /people/stanv/packages/krb5-ticket-watcher.git
Способ 1 (самый простой).
Могут повылазить всякие косяки, при не аккуратных и необдуманых поступках.
Способ 1 заключается в том чтобы отправить на git.alt remotes-ветки один к одному.
Единственный недостаток заключается в том, что браузер репозитория на git.alt не будет нам показывать remotes ветки. т.е. О них мы знаем, и не должны забывать. git-clone не забирает их себе.
Пора отправить на git.alt наше чудище, подготовимся к этому. $ git config --add remote.git-alt.url 'git.alt:/'
$ git config --add remote.git-alt.push '+refs/heads/*:refs/heads/*' Что аналогично $ git push --all git.alt:/people/stanv/packages/krb5-ticket-watcher.git
$ git config --add remote.git-alt.push '+refs/tags/*:refs/tags/*' Что аналогично git push --tagsl git.alt:/people/stanv/packages/krb5-ticket-watcher.git
$ git config --add remote.git-alt.push '+refs/remotes/*:refs/remotes/*' Та самая волшебная строка.
После если мы посмотрим в .git/config, должны увидеть что-то типа:
[remote "git-alt"]
push = +refs/remotes/*:refs/remotes/* push = +refs/tags/*:refs/tags/* push = +refs/heads/*:refs/heads/* url = git.alt:/people/stanv/packages/krb5-ticket-watcher.git
Теперь одной командой мы отправим наш репозитарий на git.alt:
$ git push git-alt RSA host key for IP address '194.107.17.12' not in list of known hosts. Counting objects: 587, done. Compressing objects: 100% (505/505), done. Writing objects: 100% (587/587), 165.01 KiB, done. Total 587 (delta 417), reused 0 (delta 0) To git.alt:/people/stanv/packages/krb5-ticket-watcher.git
* [new branch] master -> master * [new branch] tags/trunk-krb5-ticket-watcher-0.1.1 -> tags/trunk-krb5-ticket-watcher-0.1.1 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.1@12 -> tags/trunk-krb5-ticket-watcher-0.1.1@12 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2 -> tags/trunk-krb5-ticket-watcher-0.1.2 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2@24 -> tags/trunk-krb5-ticket-watcher-0.1.2@24 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3 -> tags/trunk-krb5-ticket-watcher-0.1.3 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@40 -> tags/trunk-krb5-ticket-watcher-0.1.3@40 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@43 -> tags/trunk-krb5-ticket-watcher-0.1.3@43 * [new branch] tags/trunk-krb5-ticket-watcher-0.2.0 -> tags/trunk-krb5-ticket-watcher-0.2.0 * [new branch] trunk -> trunk * [new tag] 1.0.1-alt1 -> 1.0.1-alt1 * [new tag] v1.0.1 -> v1.0.1
girar-sendmail: email notification about `refs/heads/master' update sent. girar-sendmail: email notification about `refs/tags/1.0.1-alt1' update sent. girar-sendmail: email notification about `refs/tags/v1.0.1' update sent. Repacking repository... done
$ ssh git.alt build /people/stanv/packages/krb5-ticket-watcher.git 1.0.1-alt1 RSA host key for IP address '194.107.17.12' not in list of known hosts. new task #2946: owner=stanv repo=sisyphus task #2946: added #1: build tag 1.0.1-alt1 from /people/stanv/packages/krb5-ticket-watcher.git task #2946: queued, result will be emailed to stanv@altlinux.org
$ ssh git.alt task ls RSA host key for IP address '194.107.17.12' not in list of known hosts.
- 2946 AWAITING sisyphus krb5-ticket-watcher.git=1.0.1-alt1
Пришло время обновить пакет:
$ git clone git.alt:/people/stanv/packages/krb5-ticket-watcher.git Initialized empty Git repository in /home/stanv/tmp/krb5-ticket-watcher/.git/ RSA host key for IP address '194.107.17.12' not in list of known hosts. remote: Counting objects: 587, done. remote: Compressing objects: 100% (88/88), done. remote: Total 587 (delta 417), reused 587 (delta 417) Receiving objects: 100% (587/587), 157.75 KiB, done. Resolving deltas: 100% (417/417), done.
$ cd krb5-ticket-watcher
$ git branch -a
- master
origin/HEAD origin/master
$ git svn init --stdlayout https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch $ git config --add remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
[remote "origin"]
url = git.alt:/people/stanv/packages/krb5-ticket-watcher.git fetch = +refs/heads/*:refs/remotes/origin/* fetch = +refs/remotes/*:refs/remotes/*
$ git fetch RSA host key for IP address '194.107.17.12' not in list of known hosts. From git.alt:/people/stanv/packages/krb5-ticket-watcher
* [new branch] tags/trunk-krb5-ticket-watcher-0.1.1 -> tags/trunk-krb5-ticket-watcher-0.1.1 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.1@12 -> tags/trunk-krb5-ticket-watcher-0.1.1@12 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2 -> tags/trunk-krb5-ticket-watcher-0.1.2 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.2@24 -> tags/trunk-krb5-ticket-watcher-0.1.2@24 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3 -> tags/trunk-krb5-ticket-watcher-0.1.3 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@40 -> tags/trunk-krb5-ticket-watcher-0.1.3@40 * [new branch] tags/trunk-krb5-ticket-watcher-0.1.3@43 -> tags/trunk-krb5-ticket-watcher-0.1.3@43 * [new branch] tags/trunk-krb5-ticket-watcher-0.2.0 -> tags/trunk-krb5-ticket-watcher-0.2.0 * [new branch] trunk -> trunk
$ git branch -a
- master
origin/HEAD origin/master tags/trunk-krb5-ticket-watcher-0.1.1 tags/trunk-krb5-ticket-watcher-0.1.1@12 tags/trunk-krb5-ticket-watcher-0.1.2 tags/trunk-krb5-ticket-watcher-0.1.2@24 tags/trunk-krb5-ticket-watcher-0.1.3 tags/trunk-krb5-ticket-watcher-0.1.3@40 tags/trunk-krb5-ticket-watcher-0.1.3@43 tags/trunk-krb5-ticket-watcher-0.2.0 trunk
$ git log -1 remotes/trunk
commit 217088707bda6e1334d773aab2290f9bd4275a01
Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5>
Date: Fri Sep 5 10:17:28 2008 +0000
version 1.0.1 -- minor text change git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@87 a89c6a6b-391f-0410-b44d-9b669724f1e5
$ git svn fetch
$ git log -1 remotes/trunk commit 9d1d6507fa85f60ca72e9a4f4725caf0ac93823e Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5> Date: Mon Mar 16 09:40:32 2009 +0000
version 1.0.2 git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@90 a89c6a6b-391f-0410-b44d-9b669724f1e5
Операция заняла не более одной минуты. Что ....
Создадим пакет на основе новой стабильной версии: $ git log trunk Например меня можно найти ее можно найти с помощью: $ git log trunk
Мы находимся в локальной ветке master:: $ git branch
- master
Обновим ветку master до новой версии: $ git tag -s -m 'v1.0.2' v1.0.2 9d1d6507fa85f60ca7
Необходим пароль для доступа к секретному ключу пользователя: "Andriy Stepanov (ALT Linux packages sign key) <stanv@altlinux.ru>" 1024-бит DSA ключ, ID 289196AA, создан 2007-02-07
$ git tag 1.0.1-alt1 v1.0.1 v1.0.2
$ git merge v1.0.2
$ gear-update-tag -a
$ cat .gear/tags/list 1006394f8ce60c88ba780600a3512424b0c39912 v1.0.2
$ add_changelog krb5-ticket-watcher.spec $ git add add_changelog krb5-ticket-watcher.spec
(Можете использовать gear-changelog, прежде прочитав manpage GEAR-CHNAGELOG-RULES(5) )
Пытаемя собрать пакет: $ gear-rpm --commit --bb
Если собралось можем делать коммит:
$ gear-commit
$ git config --add remote.origin.push '+refs/remotes/*:refs/remotes/*'
Отправим локальные ветки
$ git push --all RSA host key for IP address '194.107.17.12' not in list of known hosts. Counting objects: 84, done. Compressing objects: 100% (65/65), done. Writing objects: 100% (69/69), 47.55 KiB, done. Total 69 (delta 56), reused 0 (delta 0) To git.alt:/people/stanv/packages/krb5-ticket-watcher.git
8c15ac7..1a951cf master -> master
girar-sendmail: email notification about `refs/heads/master' update sent. Repacking repository... done
И все прочее (срабатывают правила push из .git/config): [stanv@stanv krb5-ticket-watcher]$ git push RSA host key for IP address '194.107.17.12' not in list of known hosts. Counting objects: 1, done. Writing objects: 100% (1/1), 310 bytes, done. Total 1 (delta 0), reused 0 (delta 0) To git.alt:/people/stanv/packages/krb5-ticket-watcher.git
2170887..9d1d650 trunk -> trunk * [new branch] origin/HEAD -> origin/HEAD * [new branch] origin/master -> origin/master * [new tag] v1.0.2 -> v1.0.2
girar-sendmail: email notification about `refs/tags/v1.0.2' update sent. Repacking repository... done
Вышеизложенный материал не претендует на правильность, корректность, оффициальность, и как единственный правильный способ.
Следует учитывать что разработчик может удалять из своего SVN репозитария tags & branches, Т.е. могут существовать в git репозитарии которые тоже необходимо будет удалять из git-репозитария.
$ find .git/refs/remotes/ .git/refs/remotes/ .git/refs/remotes/trunk .git/refs/remotes/tags .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.1@12 .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.1 .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.2@24 .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.2 .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.3@40 .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.3 .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.1.3@43 .git/refs/remotes/tags/trunk-krb5-ticket-watcher-0.2.0
$ find .git/refs/heads/ .git/refs/heads/ .git/refs/heads/master .git/refs/heads/upstream
Способ №2
Вариация Способа №1, но без закидывания на git.alt remotes веток.
Ошибки которых следует избегать:
При создании локального git репозитария у себя на рабочем компьютере, не называйте его с суффиксом .git Суффикс .git - означает что репозиторий является bare, т.е. не содержит копию исходных кодов. Bare репозиторий не имеет WORKING TREE, а содержит только базу данных git.