推送时Jira Subversion Mirror / SubGit远程错误

Bra*_*adW 5 svn git bitbucket subgit

因此,使用Subversion mirror(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'
Run Code Online (Sandbox Code Playgroud)

我敢肯定,我过去曾经做过,而且效果很好。我将尝试还原并再次执行此操作,但只是想知道其他人是否已看到此错误并知道其含义。

谢谢,

布拉德

vad*_*hev 4

此错误消息是在 SubGit 版本 3.2.1 和 SVN Mirror 附加组件版本 3.3.0 中引入的。

SubGit/SVN Mirror 拒绝会导致 Subversion 存储库中的分支替换的推送操作。Git 变更可能导致 SVN 端替换的情况基本上有两种:

  1. 用力推。

    当强行推送非快进更新时,SubGit/SVN Mirror 除了删除分支的当前版本并从某个较旧的版本重新创建它之外什么也不做,因为这正是非快进更新所做的:来自分支提示以外的提交的分支历史记录。

  2. 从一个分支快进合并到另一个分支。

    当创建一个新分支foomaster

    $ git checkout -b foo
    $ git commit -am 'fix foo'
    [foo ca3caf9] fix foo
    
    Run Code Online (Sandbox Code Playgroud)

    然后将该分支推送到 SubGit 镜像:

    $ git push origin foo
    ...
    Sending commits to SVN repository:
      remote:   ca3caf9 => r10 branches/foo
    
    Run Code Online (Sandbox Code Playgroud)

    它被ca3caf9映射到branches/foo@10.

    最后,将分支合并foomaster

    $ git checkout master
    $ git merge foo
    Updating 0e39ad2..ca3caf9
    Fast-forward
    
    Run Code Online (Sandbox Code Playgroud)

    注意到正在更新...快进消息吗?这意味着git merge在 上没有发现新的提交master,因此不需要创建合并提交,即只需将指针从较旧的提交git merge移动到较新的提交。master0e39ad2ca3caf9

    master现在当一个人推送到 SubGit 镜像时会发生什么:

    $ git push origin master
    
    Run Code Online (Sandbox Code Playgroud)

    SubGit 发现已从映射到master更新为映射到。SubGit 只能删除并重新创建它,这显然会导致替换.0e39ad2trunk@9ca3caf9branches/foo@10trunkbranches/foo@10trunk

因此,我们确保 SubGit 不会在这两种情况下替换分支,除非 SubGit 管理员明确设置以下配置选项:

$ edit REPO/subgit/config
...
[svn]
    allowBranchReplacement = true
...
$ subgit install REPO
Run Code Online (Sandbox Code Playgroud)

但是,我建议保持svn.allowBranchReplacement设置false并遵循这些最佳实践,以避免原始问题中报告的错误消息:

  • 切勿强行推动任何东西;更喜欢合并、恢复分支更改而不是覆盖它们。

  • 将一个分支合并到另一个添加--no-ff选项时:git merge当它宁愿进行快进更新时,它会强制创建合并提交,否则:

    $ git merge --no-ff foo
    
    Run Code Online (Sandbox Code Playgroud)

更新:

如果您使用 SVN Mirror 附加组件,您可以在“分支映射”svn.allowBranchReplacement选项卡中指定选项:

分支映射

文本字段应如下所示:

[svn]
    trunk = ...
    ...
    allowBranchReplacement = true
Run Code Online (Sandbox Code Playgroud)

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