Как вы перебазируете ветку git-svn и сохраняете метаданные нетронутыми? - PullRequest
3 голосов
/ 16 июня 2011

Я недавно использовал git svn branch для создания ветки (как в Subversion, так и в git).

Я заметил, что (по какой-то причине я не уверен в этом; возможно, ошибка или, возможно, я неправильно создал ветвь?) У git commit для создания ветки есть два родителя: один наверху дерева в то время Я создал ветку (неправильную, так как я разветвился от предыдущей ревизии) и одну в (ожидаемой) предыдущей ревизии.

Этот «второй родитель» вызывает у меня всевозможные страдания, поскольку я сейчас пытаюсь слиться из другой ветви в новую, и представление git об общем предке неверно.

Я нашел этот вопрос , который объясняет, как заставить ветвь git иметь правильного родителя с помощью rebase. Проблема в том, что ребазинг коснулся только моего локального филиала HEAD, а не удаленного, привязанного к репозиторию git-svn Обычно это было бы очень плохо, но поскольку я единственный, кто использует этот репозиторий git-svn, мне все равно: я просто хочу переместить удаленную ветку в скорректированный коммит сейчас.

Итак, мой вопрос: теперь, когда у меня есть родительский элемент для локальной ветки, указывающий на правильный коммит, от которого он разветвлен, есть ли способ для меня переместить удаленную ветку в ту же HEAD, чтобы я мог например) запустить git svn rebase, не запутавшись? (Боюсь, что если я изменю его вручную, файл .git/refs/remotes/<mybranch>/.rev_map... больше не будет совпадать с SVN ...?)


Редактировать : Для ответа на вопрос, поставленный в комментарии, да, ветка отмечена. Я собираюсь изменить названия своих веток, чтобы защитить невинных, но давайте представим, что это выглядит так:

$ git branch
* git_mysvnbranch
  git_releasebranch
  master

$ git branch -r
  trunk
  mysvnbranch
  releasebranch

Теперь, когда я создал ветвь, у mysvnbranch был родитель обоих стволов и произвольная точка от ствола, от которой я разветвился. Теперь я хочу взять releasebranch и объединить его с mysvnbranch, когда я вижу проблему. Если я запускаю gitk, это выглядит так:

o [git_mysvnbranch] [remotes/mysvnbranch]
|\ <--- bad pointer here
| o [remotes/trunk]
| |
| o 
| | o [git_releasebranch] [remotes/releasebranch]
| | |
| o o
| |/
| o
| |
| o
| |
| o
|/
o [arbitrary branch point]

Таким образом, вы можете увидеть проблему, если я хочу слить в [remotes/releasebranch]. Если я сделаю ребаз, я могу сделать так:

o [git_mysvnbranch]
|
| o [remotes/mysvnbranch]
| |\ <--- bad pointer here
| | o [master] [remotes/trunk]
| | |
| | o 
| | | o [git_releasebranch] [remotes/releasebranch]
| | | |
| | o o
| | |/
| | o
| | |
| | o
| | |
| | o
| |/
|/
o [arbitrary branch point]

А теперь я хочу избавиться от версии [remotes/mysvnbranch] с плохим родителем и указать, куда вместо нее указывает [git_mysvnbranch] 1035 *.

Но вот любопытная вещь, которую я только что узнал: метаданные svn действительно могут быть нетронутыми. Я просто сделал это:

$ git svn rebase -n
Remote Branch: refs/remotes/mysvnbranch
SVN URL: svn://subversionrepo/branches/mysvnbranch

Так что, возможно, я ни о чем не беспокоюсь. Я попробую это еще немного, чтобы попытаться выяснить.


Редактировать 2 : Я ни о чем не беспокоюсь. Как только я попытался git svn rebase из перебазированной ветки, он попытался повторно объединить изменения, которые уже были объединены с веткой git.

1 Ответ

0 голосов
/ 16 июня 2011

После большой боли и страданий я нашел обходной путь, но он не очень хороший:

$ svn copy -r <arbitrary-branch-point> svn://subversionrepo/trunk \ 
                                       svn://subversionrepo/branches/mysvnbranch2

То есть я сдался и воссоздал ветку с другим именем. (используя клиент Subversion, просто чтобы быть в безопасности.) Затем я сделал git svn fetch --all. Я думаю, что смогу перенести мою работу в новую ветку и назвать это днем. Когда я проверяю gitk, новая ветвь основана на правильной ревизии.

Я надеюсь, что кто-то знает о лучшем обходном пути, потому что я не думаю, что это будет приемлемо для всех, у кого есть такая же проблема.

К вашему сведению, это произошло потому, что ветка с тем же именем была создана неправильно, а затем удалена, прежде чем я начал это делать. Это, вероятно, запутал git-svn.

...