git-svn-rebase передает тег SVN - PullRequest
1 голос
/ 21 июля 2010

Я только начинаю с git и использую его для взаимодействия с SVN-репозиторием. Репозиторий SVN имеет стандартный формат, поэтому я настроил свою песочницу как

git svn clone <repo> -s

Сначала все выглядело нормально, но после нескольких перебазировок, dcommits и тегов я, кажется, всегда фиксирую тег SVN. Выполнение пробного прогона dcommit возвращает:

$ git svn dcommit --dry-run
Committing to http://proj.badc.rl.ac.uk/svn/badc/users/spascoe/metaconfig/tags/0.1.1 ...
diff-tree a1265119164b79cfb12d28a7059d453fb4eb13f7~1 a1265119164b79cfb12d28a7059d453fb4eb13f7

Мой .git / config:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    autocrlf = false
[svn-remote "svn"]
    url = http://proj.badc.rl.ac.uk/svn/badc
    fetch = users/spascoe/metaconfig/trunk:refs/remotes/trunk
    branches = users/spascoe/metaconfig/branches/*:refs/remotes/*
    tags = users/spascoe/metaconfig/tags/*:refs/remotes/tags/*

Бродить в .git не помогает. Есть идеи, что не так?

1 Ответ

2 голосов
/ 15 августа 2010

В команде git svn была ошибка, из-за которой ветка master могла оставить что-то, кроме ствола svn, при первоначальном импорте хранилища svn.Это было исправлено в git v1.6.5 и новее (в v1.6.5-rc0 ~ 75 , если у вас есть git).

Если вы уже закончили проверять репозиторий svnи чтобы убедиться, что основная ветвь указывает на ствол svn, выполните следующие действия.

ПРИМЕЧАНИЕ: В этих инструкциях предполагается, что вы зафиксировали или сохранили все локальные изменения, которые вы сделали.Используйте git stash save, чтобы сохранить любую незафиксированную работу, и git branch newbranchname, чтобы создать ветку для вашего последнего коммита.

  1. Переключитесь на основную ветку, используя git checkout master, если вы еще не там.,Используйте git branch, чтобы увидеть вашу текущую ветку, которая со звездочкой ('*') рядом с ней.

  2. Запустите git svn info и отметьте "URL:"поле.Если URL указывает на транк, то все готово.Следующие git svn dcommit будут фиксировать транк из главной ветви.

  3. Если git svn info указывает на тег или URL-адрес ветви, запустите git log и найдите первый коммит, который имеетURL-адрес "git-svn-id:", который указывает на URL-адрес вашей соединительной линии SVN.Скопируйте 40-символьный хеш коммита (в строке, начинающейся с «коммита»), который представляет этот коммит.

  4. Сбросьте основную ветвь в хеш коммита с помощью git reset --hard commit-hash вместо "commit-hash "с хэшем коммита из шага 3.

    ПРИМЕЧАНИЕ: Этот шаг самый опасный!Убедитесь, что вы сохранили всю свою работу!При необходимости создайте архив из своего рабочего каталога.

  5. Запустите git svn info еще раз, чтобы убедиться, что в поле "URL:" указано, что вы находитесь на внешней линии.Если этого не произойдет, вы скопировали неверный хеш коммита в шаге 3. Перейдите к шагу 3. и попробуйте снова.

  6. Запустите git svn rebase, чтобы обновить основную ветвь до последней версии магистралив вашем хранилище SVN.

Pro Совет: Эксперты заметят, что вы можете анализировать строку "git-svn-id:" в нижней части каждого журнала фиксации, чтобы определить,конкретный коммит находится на транке, на теге или на ветке.Таким образом, достаточно использовать git log master, чтобы проверить, указывает ли первый коммит в ветви master на URL-адрес соединительной линии вашего хранилища svn.

...