Участник:Stanv/Gitsvn: различия между версиями

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


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


Создадим пустой каталог для будущего GIT-репозитария:
Создадим пустой каталог для будущего GIT-репозитория:
<source lang="bash">
<source lang="bash">
$ mkdir krb5ticketwatch
$ mkdir krb5ticketwatch
Строка 20: Строка 20:
</source>
</source>


Вытягиваем из SVN репозитария всю историю:
Вытягиваем из SVN репозитория всю историю:
<source lang="bash">
<source lang="bash">
$ git svn fetch
$ git svn fetch
Строка 96: Строка 96:
В ALT Linux пакеты сопровождаются с помощью GEAR(1).
В ALT Linux пакеты сопровождаются с помощью GEAR(1).


Создадим каталок для конфигурационных файлов GEAR(1).
Создадим каталог для конфигурационных файлов GEAR(1).
$ mkdir .gear
$ mkdir .gear


Строка 172: Строка 172:
Identity added: /home/stanv/.ssh/id_dsa (/home/stanv/.ssh/id_dsa)
Identity added: /home/stanv/.ssh/id_dsa (/home/stanv/.ssh/id_dsa)


Создадим репозитарий на git.alt для нашего нового пакета:
Создадим репозиторий на git.alt для нашего нового пакета:


$ ssh git.alt init-db krb5-ticket-watcher
$ ssh git.alt init-db krb5-ticket-watcher
Строка 181: Строка 181:
Способ 1 (самый простой).
Способ 1 (самый простой).


Могут повылазить всякие косяки, при не аккуратных и необдуманых поступках.
Могут повылазить всякие косяки, при неаккуратных и необдуманных поступках.


Способ 1 заключается  в том чтобы отправить на git.alt remotes-ветки один к одному.
Способ 1 заключается  в том чтобы отправить на git.alt remotes-ветки один к одному.
Строка 209: Строка 209:
         url = git.alt:/people/stanv/packages/krb5-ticket-watcher.git
         url = git.alt:/people/stanv/packages/krb5-ticket-watcher.git


Теперь одной командой мы отправим наш репозитарий на git.alt:
Теперь одной командой мы отправим наш репозиторий на git.alt:


$ git push git-alt
$ git push git-alt
Строка 358: Строка 358:
(Можете использовать gear-changelog, прежде прочитав manpage GEAR-CHNAGELOG-RULES(5)  )
(Можете использовать gear-changelog, прежде прочитав manpage GEAR-CHNAGELOG-RULES(5)  )


Пытаемя собрать пакет:
Пытаемся собрать пакет:
$ gear-rpm --commit --bb
$ gear-rpm --commit --bb


Если собралось можем делать коммит:
Если собралось - можем делать коммит:


$ gear-commit
$ gear-commit
Строка 394: Строка 394:
Repacking repository... done
Repacking repository... done


Вышеизложенный материал не претендует на правильность, корректность, оффициальность, и как единственный правильный способ.
Вышеизложенный материал не претендует на правильность, корректность, официальность, и не должен рассматриваться как единственный правильный способ.


Следует учитывать что разработчик может удалять из своего SVN репозитария tags & branches,
Следует учитывать что разработчик может удалять из своего SVN репозитория tags & branches,
Т.е. могут существовать в git репозитарии которые тоже необходимо будет удалять из git-репозитария.
Т.е. могут существовать в git репозитории которые тоже необходимо будет удалять из git-репозитория.




Строка 427: Строка 427:
Ошибки которых следует избегать:
Ошибки которых следует избегать:


При создании локального git репозитария у себя на рабочем компьютере, не называйте его с суффиксом .git
При создании локального git репозитория у себя на рабочем компьютере, не называйте его с суффиксом .git
Суффикс .git - означает что репозиторий является bare, т.е. не содержит копию исходных кодов.
Суффикс .git - означает что репозиторий является bare, т.е. не содержит копию исходных кодов.
Bare репозиторий не имеет WORKING TREE, а содержит только базу данных git.
Bare репозиторий не имеет WORKING TREE, а содержит только базу данных git.

Текущая версия от 04:37, 10 марта 2019

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

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

  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.