所以,使用subversion镜像(subgit)和最新的位桶(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'
我相信我以前做过,而且效果很好。我将尝试返回并再次执行此操作,但只是想知道其他人是否已看到此错误并知道其含义。
谢谢,
布拉德
最佳答案
此错误消息是在subgit version 3.2.1和svn mirror插件version3.3.0中引入的。
subgit/svn mirror拒绝在subversion存储库中导致分支替换的推送操作。当git更改可能导致svn端的替换时,基本上有两种情况:
用力推。
当强制推送非快进更新时,subgit/svn mirror除了删除分支的当前版本并从某个较旧的修订版中重新创建它之外,别无选择,因为这正是非快进更新所做的:从分支提示以外的提交继续分支历史记录。
快进合并从一个分支到另一个分支。
当您从foo
创建新分支时:
$ git checkout -b foo
$ git commit -am 'fix foo'
[foo ca3caf9] fix foo
然后将该分支推送到subgit mirror:
$ git push origin foo
...
Sending commits to SVN repository:
remote: ca3caf9 => r10 branches/foo
它将
master
映射到ca3caf9
。最后,一个合并分支
branches/foo@10
返回foo
:$ git checkout master
$ git merge foo
Updating 0e39ad2..ca3caf9
Fast-forward
注意到更新…快进信息?这意味着
master
在git merge
上没有找到新的提交,因此不需要创建合并提交,即master
只是将git merge
指针从旧的提交移到新的提交。现在,当您将
master
推到subgit mirror时会发生什么:$ git push origin master
subgit发现
0e39ad2
已从映射到ca3caf9
的master
更新到映射到master
的0e39ad2
。subgit只能删除trunk@9
并从ca3caf9
重新创建它,这显然导致了branches/foo@10
的替换。因此,除非subgit administrator显式设置以下配置选项,否则我们确保subgit不会在这两种情况下替换分支:
$ edit REPO/subgit/config
...
[svn]
allowBranchReplacement = true
...
$ subgit install REPO
但是,我建议将
trunk
设置为branches/foo@10
并遵循以下最佳实践,以避免在原始问题中报告错误消息:不要强制推送任何内容;更喜欢合并、还原分支出的更改,而不是覆盖它们。
将一个分支合并到另一个分支时,添加
trunk
选项:它强制svn.allowBranchReplacement
创建合并提交,否则它将执行快进更新:$ git merge --no-ff foo
更新:
如果使用的是SVN Mirror附加模块,则可以在“分支映射”选项卡中指定
false
选项:文本字段应如下所示:
[svn]
trunk = ...
...
allowBranchReplacement = true
然后单击应用更改按钮以激活此新设置。