所以,使用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

注意到更新…快进信息?这意味着mastergit merge上没有找到新的提交,因此不需要创建合并提交,即master只是将git merge指针从旧的提交移到新的提交。
现在,当您将master推到subgit mirror时会发生什么:
$ git push origin master

subgit发现0e39ad2已从映射到ca3caf9master更新到映射到master0e39ad2。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选项:
git - 推送时Jira Subversion Mirror/SubGit远程错误-LMLPHP
文本字段应如下所示:
[svn]
    trunk = ...
    ...
    allowBranchReplacement = true

然后单击应用更改按钮以激活此新设置。

08-28 01:03