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:

  1. Сила толчка.

    Когда кто-то принудительно продвигает обновление без ускоренной пересылки, SubGit/SVN Mirror ничего не может сделать, кроме как удалить текущую версию ветви и заново создать ее из какой-то более старой ревизии, потому что это именно то, что делает обновление без ускоренной перемотки: продолжение история ветвления из коммита, отличного от кончика ветки.

  2. Быстрое слияние из одной ветви в другую.

    Когда кто-то создает новую ветку 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

и затем нажмите кнопку Применить изменения, чтобы активировать этот новый параметр.

Другие вопросы по тегам