所以,使用Subversion镜像(SubGit)和最新的BitBucket(4.8.3)。对master有两个更改。一个直接制作,一个制作与功能分支合并。推送更改时,获取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'
我确信我过去做过这件事并且工作得很好。我会尝试恢复并再次这样做,但只是想知道其他人是否已经看到这个错误并知道它意味着什么。
谢谢,
布拉德
答案 0 :(得分:4)
SubGit版本3.2.1和SVN Mirror附加版本3.3.0引入了此错误消息。
SubGit / SVN Mirror拒绝在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
只是从较早的提交{{1}移动了master
指针更新的0e39ad2
。
现在当将ca3caf9
推送到SubGit镜像时会发生什么:
master
SubGit发现$ git push origin master
已从master
映射到0e39ad2
更新为映射到trunk@9
的{{1}}。 SubGit无法做到,只需删除ca3caf9
并从branches/foo@10
重新创建,这显然会导致替换trunk
。
因此我们确保SubGit不会在这两种情况下替换分支,除非SubGit管理员明确设置以下配置选项:
branches/foo@10
但是,我建议将trunk
设置为$ edit REPO/subgit/config
...
[svn]
allowBranchReplacement = true
...
$ subgit install REPO
并遵循这些最佳做法,以避免原始问题中报告的错误消息:
不要强行推动任何东西;更愿意合并,恢复分支变更而不是覆盖它们。
将一个分支合并到另一个分支时添加svn.allowBranchReplacement
选项:它强制false
创建合并提交,否则它会更快地进行快速更新:
--no-ff
更新:
如果您正在使用SVN Mirror插件,则可以在分支映射标签中指定git merge
选项:
文本字段应如下所示:
$ git merge --no-ff foo
然后单击应用更改按钮以激活此新设置。