Я только запускаю с мерзавца и использую его для взаимодействия с репозиторием SVN. svn repo находится в стандартном формате, таким образом, я настроил свою песочницу как
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 не помогает. Какая-либо идея, что идет не так, как надо?
В команде git svn
была ошибка, из-за которой главная ветвь могла указывать на что-то другое, кроме ствола svn, при первоначальном импорте репозитория svn. Это было исправлено в git v1.6.5 и более поздних версиях (в v1.6.5-rc0 ~ 75 , если вы проверяли git).
Если вы уже закончили проверку репозитория svn и хотите убедиться, что главная ветвь указывает на ствол svn, сделайте следующее.
ПРИМЕЧАНИЕ. В этих инструкциях предполагается, что вы зафиксировали или сохранили любые сделанные локальные изменения. Используйте git stash save
, чтобы сохранить любую незавершенную работу, и git branch newbranchname
, чтобы создать ветку к вашей последней фиксации.
Переключитесь на главную ветку, используя git checkout master
, если вы еще не там. Используйте git branch
, чтобы увидеть текущую ветку, рядом с которой стоит звездочка ('*').
Запустите git svn info
и проверьте поле « URL:
». Если URL-адрес указывает на транк, значит, все готово. Следующий git svn dcommit
выполнит фиксацию в магистраль из главной ветки.
Если git svn info
указывает на тег или URL-адрес ветки, запустите git log
и найдите первую фиксацию с " git-svn-id:
"URL-адрес, указывающий на URL-адрес вашей магистрали svn.Скопируйте 40-символьный хэш фиксации (в строке, начинающейся с «фиксации»), представляющий эту фиксацию.
Сбросьте хеш фиксации в главной ветке с помощью git reset --hard commit-hash
, заменив « commit-hash
» хешем фиксации из шага 3.
ПРИМЕЧАНИЕ : Этот шаг самый опасный! Убедитесь, что вы сохранили всю свою работу! При необходимости сделайте архив вашего рабочего каталога.
Снова запустите git svn info
, чтобы убедиться, что в поле « URL:
» указано, что вы находитесь на внешней линии. В противном случае вы скопировали неправильный хеш фиксации на шаге 3. Перейдите к шагу 3 и повторите попытку.
Запустите git svn rebase
, чтобы обновить главную ветку до последней версии на магистрали в репозитории svn.
Совет от профессионалов: Эксперты заметят, что вы можете проанализировать строку « git-svn-id:
» внизу каждого журнала фиксации, чтобы определить, находится ли конкретная фиксация в магистрали, на тег или на ветке. Таким образом, достаточно использовать git log master
, чтобы проверить, указывает ли первая фиксация в основной ветке на магистральный URL вашего репозитория svn.