Разрешение Git Svn конфликтов
Я использую Git-Svn для взаимодействия с хранилищем Svn на работе, и я не могу найти способ эффективно разрешать конфликты на всю жизнь. Я читал другие вопросы по этой теме, но, очевидно, мне нужно что-то еще более коррективное, потому что я всегда оказываюсь в каком-то бесконечном цикле. Я перезагружаюсь, использую mergetool (meld) для разрешения моих конфликтов и, когда дохожу до конца всего этого, я пытаюсь выполнить dcommit и получаю конфликт слияния во время ошибки фиксации.
Я знаю, что это похоже на дубликат, но разочарование заставляет меня спросить еще раз, с некоторыми очень конкретными деталями о том, как я поступаю по этому поводу, так что, надеюсь, кто-то может сказать мне точно, где мой процесс облажался.
Моя настройка:
У меня есть удаленный филиал (svn / trunk), локальный филиал (trunk) и другой локальный филиал, в котором я обычно работаю (working-trunk). ствол был извлечен из svn / trunk, а рабочий ствол был извлечен из trunk.
Вот что я делал:
- На моем сундуке,
git svn rebase
(возвращает конфликты) git mergetool
- [разрешить конфликты для этого файла]
- Сохраните объединенный файл из соединения и закройте соединение.
git add .
git rebase --continue
- [промыть, повторить]
- Если я получаю сообщение с вопросом, использовал ли я
git add
Яgit rebase --skip
Когда я заканчиваю все зарегистрированные изменения, все просто останавливается, и я думаю, может быть, я не уверен, что делать в этот момент. Git ничего не показывает, чтобы быть совершенным, и я, кажется, вернулся на ствол. Затем Git позволяет мне коммитьить, но если я сразу же после этого пытаюсь выполнить ребазинг, я в конечном итоге заново разрешаю только что разрешенные конфликты.
Здесь явно есть критическая часть, которую я пропускаю, но я ее просто не вижу, и это вызывает много проблем и разочарований. Слияния в Git могут быть простыми, но я уверен, что не считаю, что это так.
Благодарю.
ОБНОВЛЕНИЕ: Просто хотел выпустить быстрое обновление, чтобы описать мой рабочий процесс в случае, если это часть (или все) проблемы.
Для начала, после клонирования моего хранилища с svn/
у меня есть префикс svn/trunk
удаленная ветка. При условии:
- я
git co -b trunk svn/trunk
проверить мой пульт в местном отделении. - я
git co -b working-trunk
создать рабочую ветвь, которую я использую для создания еще одной степени разделения, чтобы моя локальная магистраль всегда могла отражать мою удаленную магистраль. - Я удаляю основную ветку по умолчанию (при работе с svn мне легче думать в терминах "trunk", а не "master").
Когда у меня есть все мои ветви, мой типичный рабочий процесс выглядит следующим образом:
- На рабочем стволе я делаю свои изменения и фиксирую их.
- я
git co trunk
и сделатьgit svn rebase
, - Предполагая, что новый код был перебазирован, я
git rebase working-trunk
, git co working-trunk
git merge trunk
git rebase trunk
git co trunk
git merge working-trunk
git svn dcommit
Это много шагов, я знаю, но это то, что рекомендовали все здесь и в других местах. Может ли мой роковой недостаток быть где-то в этом процессе?
Еще раз спасибо.
7 ответов
Я бы рекомендовал использовать git rebase вместо git merge. Svn ведет линейную историю и, кажется, иногда путается со слиянием веток git. Использование git rebase гарантирует, что SVN понимает линейную историю.
см.: http://learn.github.com/p/git-svn.html для получения дополнительной информации и рекомендаций.
У меня возникла такая же проблема (git svn rebase, который возвращает конфликты). Я обнаружил проблему в моем рабочем процессе. Вот рабочий процесс, которому я / вы должны следовать:
git svn rebase # put all the new commits on top
git svn dcommit # push the new commits to svn (will rewrite each commit message to add the svn tag)
git pull # merge the conflicts due to the commit messages
git push # push the synchronized version to the remote git server
Всякий раз, когда я забывал объединить историю после dcommit, у меня возникают новые (поддельные) конфликты, которые появляются, если я делаю новые коммиты. Чтобы решить их, вы можете либо следовать описанному выше подходу, либо, если это связано с той же проблемой, что и я, вы также можете сделать это автоматически, используя:
git svn rebase --strategy ours
Кажется, что-то работает не так, как вы думаете. Если это не маловероятные вещи, которые предложил Хэнк Гей, то это еще одна маловероятная вещь.
Моя маловероятная возможность состоит в том, что ваша ветвь не соответствует вашим ожиданиям, или вы не перепроверяете ту ветвь, которой себя считаете. Поэтому я предлагаю вам:
git branch
просто чтобы подтвердить, что ваша структура филиала - это то, что вы ожидаетедобавлять
export PS1='\e[0;31m\n\w$(__git_ps1 "(%s)") $ \e[m'
в ~/.bash_profile и войдите снова,
чтобы показать ветку (и любую внутрипроцессную команду git) в вашем приглашении:/ workspace / wikka (featurebranch1 | REBASE-i) $
Это даст вам больше отзывов (и, возможно, исключит эту WAG как возможность).
Подход SubGit может быть немного проще:
- Установите SubGit в хранилище Subversion на стороне сервера
- использование
git
неgit-svn
отправить изменения в репозиторий SVN *
При установке SubGit создается Git-аналог репозитория SVN. Клонируйте этот репозиторий в ваш локальный; создавайте любые ветви и отправляйте их в удаленный репозиторий Git, SubGit автоматически конвертирует эти ветви в SVN.
Для получения более подробной информации, пожалуйста, обратитесь к документации SubGit и сравнению git-svn.
* Работает с любым клиентом Git.
Я попытался сделать это с (n по общему признанию небольшим) конфликтом, который я принудил, и после git svn dcommit
У меня больше не было конфликтов. Разница лишь в том, что я не получил сообщение о git add
, Возможно ли, что ваша команда просто посылает много коммитов, которые конфликтуют с вашей работой? Это кажется маловероятным, но это, кажется, самое простое объяснение.
Возможно, стоит потратить время на то, чтобы снова получить репо в другом месте и проверить, можете ли вы вносить неконфликтные изменения, чтобы убедиться, что во время dcommit
этап, который скрывается как-то.
ОБНОВЛЕНИЕ: Еще одна мысль у меня была: я сделал git add foo.bar
когда я закончил разрешать конфликт. Возможно ли, что git add .
делает что-то неожиданное? Я не очень расширяю возможности git svn
все так много, так что это в значительной степени WAG.
Я только что столкнулся с этой проблемой при использовании рекомендуемого рабочего процесса, поэтому я думаю, что у нас нет ответа здесь.
Вот как я попал в эту ситуацию.
У меня есть git-репозиторий через git svn, использующий инфраструктуру Apache.
У меня есть местное отделение.
Я пытаюсь следовать этой процедуре:
1) перебазировать багажник. 2) объединить ствол в частную ветку. 3) делать работу. 4) перебазировать багажник. 5) слить частное в багажник. 6) dcommit.
Однако я все испортил и забыл перенести переход с частного на транк. Затем я внес ряд других изменений в свою частную ветку и оказался в цикле "промывай и повторяй" в совершенно ложном конфликте. Последнее изменение, которое я выдвинул, было закомментировать одну строку. Когда я затем удалил эту строку в пренебрегаемом изменении, это привело к конфликту, который не разрешится, несмотря ни на что. В конце концов я использовал --skip на нем.
Я бы рекомендовал использовать git-svn только между вашей локальной и удаленной связью. Между вашим локальным транком и локальным mytrunk, придерживайтесь стандартных функций git only Вы могли бы попробовать такой рабочий процесс:
[SVN]---git-svn---[trunk]---branch---[mytrunk]
Чтобы объединить, переключитесь на транк и выполните:
git svn rebase
Это влечет за собой изменения с пульта и объединяет его со стволом. Затем переключитесь на mytrunk и выполните:
git rebase
Это вытягивает изменения из ствола и объединяет их с mytrunk. Я думаю, что это должно работать. В противном случае, просто сделайте клон локального транка и работайте над клоном.