Бесшовная настройка git svn - PullRequest
19 голосов
/ 03 февраля 2011

Я опытный пользователь и в то же время счастлив.

Теперь я вынужден использовать SVN, и я не совсем счастлив сделать это.Пока не очень удобно использовать git svn.

Итак, вот настройки, которые я хотел бы и хочу.

  • Я использую репозиторий git, то есть git во всех отношениях смного локальных веток.
  • Я регулярно создаю несколько веток в git и объединяю их, пусть git обрабатывает все это.
  • Я хочу отправить выбранную ветку git как ветку svn со всем зеркальным отражением.
  • Когда я удаляю локальную зеркальную ветку svn git, ветка svn тоже удаляется.

Подчеркну, что я хочу, чтобы git выполнил всю тяжелую работу по слиянию и ветвлению ипросто нажмите на svn и сделайте его хранилищем.

Звучит так, будто я прошу урок по git-svn.За исключением того, что я проходил через них много раз, и все же я сталкиваюсь с ошибками, в то время как я делаю git svn rebase и git svn commit очень часто, и всегда кажется, что я говорю только с транком.отправленные и зеркальные ветки.

Ответы [ 2 ]

28 голосов
/ 03 февраля 2011

см. этот вопрос для введения в git svn branch и этот вопрос для того, как удалить удаленные ветви - или ниже для полного резюме основ git svn (включая информация из двух упомянутых вопросов).

Чтобы дать вам более полное руководство (полная настройка, охватывающая локальные и удаленные ветви, коммиты, объединение локальных филиалов - см. Ниже горизонтальную линию только для настройки филиалов), вот как легко работать с репозиторием SVN:

  • Инициализируйте ваше локальное git-репо с помощью git svn clone <url>, либо с параметром -s (stdlayout), либо с параметрами --trunk, --tags, --branches, чтобы указать каталог транка, тегов и ветвей внутри svn dir.

-s означает, что репозиторий SVN имеет макет каталога, подобный этому

/trunk
/branches/new_feature
/branches/long_fix
/tags/0.0.9
/tags/0.1.0

Если нет, вы можете указать расположение соединительных линий , ответвлений и тегов с аргументами, приведенными выше.

Когда вы клонируете репо, вы автоматически попадете в местное отделение под названием master , которое автоматически отследит trunk .

В этом случае вы делаете свои коммиты так же, как если бы вы не знали, что вы клонировали репо с git svn, за исключением того, что вы не выдвигаете коммиты :

  • Используйте git commit, чтобы совершать коммиты в вашу ветку
  • Используйте git branch <branch name> для создания локальных ветвей
  • Используйте git merge <branch name> для объединения изменений из локальных веток
  • и т.д. * * тысяча пятьдесят-одна

Вам не нужно беспокоиться о том, что вы находитесь в git svn -репо, , пока вы не захотите нажать на изменения .

В приведенной выше настройке у нас есть локальная ветка master , которая отслеживает trunk . Поэтому после выполнения коммитов внутри локальной ветки master их можно отправить в trunk с помощью следующей команды:

  • git svn dcommit (внутри вашего местного филиала master )

(обратите внимание на d в dcommit).

Чтобы проверить, куда пойдут ваши коммиты, выполните

  • git svn dcommit -n

Теперь перейдем к интересной части: создайте ветви на вашей стороне, которые отслеживаются. Действительно простое чтение вопрос выше , я просто скопирую и вставлю пример:

  • git svn branch -n -m "Branch for authentication bug" auth_bug

Обратите внимание, что в этом примере есть флаг -n, который выполняет только пробный прогон. Уберите этот флаг, чтобы сделать это по-настоящему. Команда создает ветку auth_bug в репозитории svn в директории branch , которую вы установили выше, и

  • git checkout -b auth_bug auth_bug

создает локальную ветку auth_bug (первый параметр) и позволяет ей следовать за удаленной веткой auth_bug (второй параметр), которая отображается в директорию /branches/auth_bug в репозитории svn , Удаленная ветвь auth_bug существует, поскольку вы создали ее с помощью команды git svn branch (и это может быть любая другая ветвь, уже существующая).

Внутри этой локальной ветви auth_bug все ваши коммиты будут отправлены в репозиторий svn в ветвях dir /branches/auth_bug при выполнении git svn dcommit (протестируйте его, добавив -n к команде.)

Чтобы удалить ветку (я раньше этого не делал), похоже, git svn не справляется с этим для вас, поэтому в соответствии с другим вопросом , вы должны перейти к следующему напрямую, используя команда svn:

  • svn rm $URL/branches/the_branch

Это удаляет ветку из удаленного репозитория svn, а затем вы должны удалить ее из локального репозитория git, в зависимости от того, была ли это ветка (как в приведенной выше команде) или тег:

git branch -D -r the_branch
rm -rf .git/svn/the_branch

или

git branch -D -r tags/the_tag
rm -rf .git/svn/tags/the_tag

Чтобы обновить ветку с изменениями из восходящей ветки svn ("pull"), вы можете перебазировать свою ветку поверх изменения с помощью:

  • git svn rebase

Это извлекает новые коммиты в svn, перебазирует вашу ветку и воспроизводит ваши локальные коммиты (если есть).

3 голосов
/ 11 октября 2012

Intead of git-svn , вы можете попробовать SubGit .

SubGit является двунаправленным зеркалом Git-SVN на стороне сервера.

Если у вас есть локальный доступ к хранилищу Subversion, вы можете установить в него SubGit так:

$ subgit configure $SVN_REPOS
# Adjust $SVN_REPOS/conf/subgit.conf to specify your branches and tags
# Adjust $SVN_REPOS/conf/authors.txt to specify git & svn authors mapping
$ subgit install $SVN_REPOS
...
$ INSTALLATION SUCCESSFUL

SubGit преобразует репозиторий Subversion в Git (он также работает в противоположном направлении) и устанавливает хуки SVN и Git. В результате репозитории Subversion и Git синхронизируются: каждый коммит и пуш запускают хуки, которые немедленно преобразуют входящие модификации.

Вот некоторые преимущества использования SubGit:

  1. SubGit автоматически преобразует свойства svn: ignore в файлы .gitignore, свойства svn: eol-style и svn: mime-type в .gitattributes;

  2. SubGit автоматически преобразует информацию отслеживания слияний из репозитория Git в соответствующие обновления свойств svn: mergeinfo;

  3. Можно использовать любой Git-клиент для работы с Git-репозиторием на основе SubGit, все изменения немедленно передаются аналогу Subversion.

Подробнее см. Документация SubGit и git-svn страница сравнения.

А вот описание того, как стандартные операции Git отражаются в репозитории Subversion:

  1. Создать ветку foo и перенести ее в исходный репозиторий Git:

    $ git checkout -b foo master
    $ git commit -a -m "Implement feature foo"
    $ git push origin foo
    

    Как только push выполняется, хранилище Subversion получает ветку ^ / branch / foo , скопированную из ^ / trunk с соответствующими изменениями.

  2. Объединить ветку foo до master :

    $ git checkout master 
    $ git merge foo
    $ git push
    

    На данный момент для ветки ^ / trunk создана новая ревизия с соответствующими изменениями, включая обновление svn: mergeinfo:

    + /branches/foo:rX-rY
    
  3. Удалить ветку из удаленного репозитория:

    $ git push origin +:refs/heads/foo
    

    После этого ^ / branch / foo удаляется в хранилище SVN.

SubGit - коммерческий продукт. Это бесплатно для открытых и академических проектов, а также для проектов с участием до 10 коммиттеров.

Отказ от ответственности: я один из разработчиков SubGit.

...