Jira Subversion Mirror / SubGit удаленная ошибка при нажатии
Итак, используя зеркало Subversion (SubGit) с последней версией BitBucket (4.8.3). В мастер внесены два изменения. Одна сделана напрямую, а другая сделана путем слияния из ветви функций. При нажатии на изменения, получить ошибку SubGit:
XC2T@B104315 MINGW64 /c/projects/repos/loct-demo (master)
$ git push
Total 0 (delta 0), reused 0 (delta 0)
remote: error: The following ref update is disallowed:
remote: error: refs/heads/master: leads to replacement of SVN branch 'trunk'
remote: error:
remote: error: You can allow branch replacements by setting svn.allowBranchReplacement = true in SubGit configuration file.
remote: Fetching revisions from SVN repository:
remote: up to date
remote: Sending commits to SVN repository:
To http://XC2T@localhost:7990/scm/loct/loct-demo.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://XC2T@localhost:7990/scm/loct/loct-demo.git'
Я уверен, что я делал это в прошлом, и это работало просто отлично. Я попытаюсь вернуться назад и сделать это снова, но мне просто интересно, видели ли другие эту ошибку и знают, что она означает.
Спасибо,
штифтик
1 ответ
Это сообщение об ошибке появилось в SubGit версии 3.2.1 и дополнении SVN Mirror версии 3.3.0.
SubGit / SVN Mirror отклоняет операцию push, которая может привести к замене ветви в хранилище Subversion. В основном есть два случая, когда изменения в Git могут привести к заменам на стороне SVN:
Сила толчка.
Когда кто-то принудительно продвигает обновление без ускоренной пересылки, SubGit/SVN Mirror ничего не может сделать, кроме как удалить текущую версию ветви и заново создать ее из какой-то более старой ревизии, потому что это именно то, что делает обновление без ускоренной перемотки: продолжение история ветвления из коммита, отличного от кончика ветки.
Быстрое слияние из одной ветви в другую.
Когда кто-то создает новую ветку
foo
отmaster
:$ git checkout -b foo $ git commit -am 'fix foo' [foo ca3caf9] fix foo
затем толкает эту ветку к зеркалу SubGit:
$ git push origin foo ... Sending commits to SVN repository: remote: ca3caf9 => r10 branches/foo
который получает
ca3caf9
сопоставлены сbranches/foo@10
,Наконец, одна ветвь сливается
foo
вернуться кmaster
:$ git checkout master $ git merge foo Updating 0e39ad2..ca3caf9 Fast-forward
Заметил, что Обновление... Сообщение о перемотке вперед? Это значит
git merge
не нашел новых коммитов наmaster
следовательно, не было необходимости создавать коммит слияния, т.е.git merge
просто переместилmaster
указатель от старого коммита0e39ad2
к новомуca3caf9
,Что происходит, когда кто-то толкает
master
SubGit зеркало:$ git push origin master
SubGit узнает, что
master
был обновлен с0e39ad2
сопоставлены сtrunk@9
вca3caf9
сопоставлены сbranches/foo@10
, SubGit ничего не может сделать, кроме как удалитьtrunk
и воссоздать его изbranches/foo@10
что, очевидно, приводит к заменеtrunk
,
И поэтому мы убедились, что SubGit не заменяет ветви в этих двух сценариях, если администратор SubGit явно не установит следующий параметр конфигурации:
$ edit REPO/subgit/config
...
[svn]
allowBranchReplacement = true
...
$ subgit install REPO
Тем не менее, я бы рекомендовал сохранить svn.allowBranchReplacement
установлен в false
и следуйте этим рекомендациям, чтобы избежать сообщения об ошибке в исходном вопросе:
Никогда не заставляйте толкать что-либо; предпочитайте объединять, отменять изменения, а не перезаписывать их.
При объединении одной ветви в другую добавьте
--no-ff
вариант: это заставляетgit merge
создать коммит слияния, когда он предпочел бы выполнить ускоренное обновление в противном случае:$ git merge --no-ff foo
ОБНОВИТЬ:
Если вы используете надстройку SVN Mirror, вы можете указать svn.allowBranchReplacement
опция на вкладке Отображение ветвей:
Текстовое поле должно выглядеть следующим образом:
[svn]
trunk = ...
...
allowBranchReplacement = true
и затем нажмите кнопку Применить изменения, чтобы активировать этот новый параметр.