2010-07-21 2 views
1

Я только начинаю с git и использую его для взаимодействия с SVN-репозиторием. СВН репо в стандартном формате, так что я настроил мою песочницу, какgit-svn-rebase отправляется на тег SVN

git svn clone <repo> -s 

Все вроде хорошо, но сначала после нескольких rebases, 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/конфигурации является:

[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 не помогает. Любая идея, что происходит не так?

+0

Что именно вы подразумеваете под «после нескольких [...] тегов?» – lindelof

+0

Даже когда я повторно клонирую репозиторий SVN, я заканчиваю запись тегов/0.1.1. В конце концов, я решил эту проблему, сделав фиктивную фиксацию в SVN, перейдя с git, а затем сменив мои ожидающие изменения с 1 git repo на другой. Я не вернусь к svn стволу. Я все еще хотел бы знать, как мог произойти этот беспорядок :-) – spascoe

+0

@lindelof. Честно говоря, я не помню. Я думаю, что я попробовал «git tag» и обнаружил, что ничего не сделал для svn. Затем я сделал «svn tag», прежде чем найти, что могу использовать «git svn tag». – spascoe

ответ

2

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

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

ПРИМЕЧАНИЕ: В этих инструкциях предполагается, что вы совершили или спрятали любые локальные изменения, которые вы сделали. Используйте 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 и найти первый коммит, который имеет «git-svn-id:» URL, указывающий на магистральный СВН URL. Скопируйте 40-символьный хеш фиксации (в строке, начинающейся с «commit»), которая представляет эту фиксацию.

  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, чтобы проверить, указывает ли первая фиксация на главной ветке URL-адрес соединительной линии вашего репозитория svn.

Смежные вопросы