git-svn не может создать ветвь, чтобы следовать ветвлению SVN - PullRequest
5 голосов
/ 09 января 2011

Я борюсь со следующей проблемой. Когда я продолжаю получать ревизии из SVN с

git svn fetch

Я получаю следующую ошибку:

Found possible branch point: https://somecompany.com/product/trunk
=> https://somecompany.com/product/branches/deep/branches/product-001, 72666 
Found branch parent: (refs/remotes/deep/branches/product-001) b685b7b92813885fdf 6b8e2663daf884bf504b14
Following parent with do_switch 
Successfully followed parent 
error: 'refs/remotes/deep' exists; cannot create 'refs/remotes/deep/branches/product-001'
fatal: Cannot lock the ref 'refs/remotes/deep/branches/product-001'.
update-ref -m r72667 refs/remotes/deep/branches/product-001 df51920e8f0a53f26507 c2679eb6a9dbad91e0d6: command returned error: 128

Это произошло потому, что я выбирал ревизии, используя фильтр по умолчанию для веток SVN:

[svn-remote "svn"]
    url = https://somecompany.com/someproduct
    fetch = trunk:refs/remotes/trunk
    branches = branches/*:refs/remotes/*
    tags = tags/*:refs/remotes/tags/*

Теперь у меня добавлена ​​строка ниже, но уже слишком поздно:

branches = branches/deep/branches/*:refs/remotes/deep/branches/*

Я попытался исправить это с помощью git svn reset, чтобы удалить все коммиты. На самом деле из сообщения об ошибке я вижу, что git пытается правильно, но не может из-за существующего удаленного филиала / deep.

Я попытался найти 2 возможных решения: 1. Удалите эту ветку (remotes / deep), но, поскольку она отслеживается git как remote, я не смог найти никакого решения для этого. 2. Удалите всю историю, связанную с этой веткой. Тоже безуспешно: (

Кто-нибудь знает, как бороться с моей проблемой?

Ответы [ 2 ]

4 голосов
/ 10 января 2011

Я наконец-то смог решить проблему, выполнив следующие 2 шага:

  1. Удаление refs / remotes / deep из упакованных ссылок
  2. Удаление .git / logs/ refs / remotes / deep

Но все равно есть проблема с извлечением.Мне нужно использовать

branches = branches/*:refs/remotes/*

для нормальных ветвей и

branches = branches/deep/branches/*:refs/remotes/deep/branches/*

для глубоких ветвей.К сожалению, первая спецификация включает в себя более позднюю, поэтому я получаю сообщение об ошибке «Неустранимый: невозможно заблокировать ссылку 'refs / remotes / deep'", так как git-svn пытается создать глубокую ветвь в соответствии с первой спецификацией.

Пока что я делаю это, вручную комментируя первые «ветки» и выбирая конкретные ревизии с глубокими ветвями, но это не очень хороший вариант, так как для обоих случаев слишком много ревизий.

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

1 голос
/ 26 января 2011

У меня была очень похожая проблема, и я обнаружил, что «git svn reset», а не «git reset», исправил ее.Если вы не обновите свою конфигурацию ветвей заранее, как только вы получите коммит, который проходит точку ветвления, вам придется выполнить резервное копирование, чтобы получить их снова.В противном случае они болтаются без родителя.

Итак, обновите ваши ветки, как и раньше, затем запустите

git svn reset -r<revisionnum>

и выполните вашу команду git svn fetch как обычно.Это сэкономило мне много часов на перестройку всей вещи из SVN.

В вашем случае вам, вероятно, также необходимо изучить функции "игнорирования", чтобы не отслеживать вашу встроенную ветвь.

...