Участник:Stanv/Gitsvn

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
м Gitsvn» переименована в «Участник:Stanv/Gitsvn»)
Строка 1: Строка 1:
GIT-SVN(1) & git.alt
GIT-SVN(1) & git.alt
-
Ошибки которых следует избегать:
+
Рассмотрим на примере полный цикл сопровождения пакета для ALT Linux.
-
 
+
Причём, главной особенностью будет то, что разработчик предоставляет
-
При создании локального git репозитария у себя на рабочем компьютере, не называйте его с суффиксом .git
+
полную историю разработки своего продукта в SVN (Subversion) репозитарии.
-
Суффикс .git - означает что репозиторий является bare, т.е. не содержит копию исходных кодов.
+
-
Bare репозиторий не имеет WORKING TREE, а содержит только базу данных git.
+
-
можно даже git push $remote 'refs/remotes/*:refs/heads/git-svn/*'
+
Припустим до вас пакет никто не создавал.
$ mkdir krb5ticketwatch
$ mkdir krb5ticketwatch
$ cd krb5ticketwatch
$ cd krb5ticketwatch
-
Tracking and contributing to an entire Subversion-managed project (complete with a trunk,
+
Создадим пустой репозиторий.
-
      tags and branches):
+
-
Припустим до вас пакет никто не создавал. Создадим пустой репозиторий.
+
$ git svn init --stdlayout https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch
-
 
+
-
$ git svn init -t tags -b branches -T trunk https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch
+
Initialized empty Git repository in /home/stanv/tmp/krb5ticketwatch/.git/
Initialized empty Git repository in /home/stanv/tmp/krb5ticketwatch/.git/
-
Я себе всю историю изменений из Subversion репозитория вплоть до предпоследнего релиза (-r1:87).
+
Вытягиваем из SVN рапозитария всю историю:
-
Последний релиз мы не скачиваем, так как на нем покажем как происходит обновление пакета.
+
$ git svn fetch
-
Предпоследний стабильный релиз.
+
 
-
$ git svn fetch -r1:87
+
 
 +
$ 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
$ git log -1
commit 217088707bda6e1334d773aab2290f9bd4275a01
commit 217088707bda6e1334d773aab2290f9bd4275a01
Строка 32: Строка 49:
     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: Строка 292:
   trunk
   trunk
-
$ 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 log -1 remotes/trunk
 +
commit 217088707bda6e1334d773aab2290f9bd4275a01
 +
Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5>
 +
Date:  Fri Sep 5 10:17:28 2008 +0000
-
$ git branch upstream
+
    version 1.0.1 -- minor text change
-
$ git branch
+
   
-
* master
+
    git-svn-id: https://krb5ticketwatch.svn.sourceforge.net/svnroot/krb5ticketwatch/trunk@87 a89c6a6b-391f-0410-b44d-9b669724f1e5
-
  upstream
+
-
$ mkdir .gear
 
 +
$ git svn fetch
-
commit 217088707bda6e1334d773aab2290f9bd4275a01
+
$ git log -1 remotes/trunk
 +
commit 9d1d6507fa85f60ca72e9a4f4725caf0ac93823e
Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5>
Author: mcalmer <mcalmer@a89c6a6b-391f-0410-b44d-9b669724f1e5>
-
Date:  Fri Sep 5 10:17:28 2008 +0000
+
Date:  Mon Mar 16 09:40:32 2009 +0000
-
     version 1.0.1 -- minor text change
+
     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 "v1.0.1" v1.0.1
+
Операция заняла не более одной минуты. Что ....
 +
 
 +
Создадим пакет на основе новой стабильной версии:
 +
$ 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
-
[stanv@stanv krb5ticketwatch]$ git tag
+
$ 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  
-
74ce64fc236a219f8776db20c8e9711810fc8a4c v1.0.1
+
1006394f8ce60c88ba780600a3512424b0c39912 v1.0.2
-
]$ git add krb5-ticket-watcher.spec  
+
$ add_changelog krb5-ticket-watcher.spec
-
[stanv@stanv krb5ticketwatch]$ git add .gear/
+
$ git add add_changelog krb5-ticket-watcher.spec
-
$ gear-rpm -bp --commit
+
(Можете использовать 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.

Версия 11:24, 23 марта 2009

GIT-SVN(1) & git.alt

Рассмотрим на примере полный цикл сопровождения пакета для ALT Linux. Причём, главной особенностью будет то, что разработчик предоставляет полную историю разработки своего продукта в SVN (Subversion) репозитарии.

Припустим до вас пакет никто не создавал.

$ 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


$ 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

  1. On branch master
  2. Changes to be committed:
  3. (use "git reset HEAD <file>..." to unstage)
  4. new file: .gear/rules
  5. new file: .gear/tags/3857538d0b8776183bdedc526bbb68d08e6906f6
  6. new file: .gear/tags/list
  7. 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.

  1. 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.

 
Личные инструменты