推送时Jira Subversion镜像/ SubGit远程错误

时间:2016-08-12 21:03:38

标签: git svn bitbucket subgit

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

我确信我过去做过这件事并且工作得很好。我会尝试恢复并再次这样做,但只是想知道其他人是否已经看到这个错误并知道它意味着什么。

谢谢,

布拉德

1 个答案:

答案 0 :(得分:4)

SubGit版本3.2.1和SVN Mirror附加版本3.3.0引入了此错误消息。

SubGit / SVN Mirror拒绝在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 mergemaster上没有找到新的提交,因此不需要创建合并提交,即git merge只是从较早的提交{{1}移动了master指针更新的0e39ad2

    现在当将ca3caf9推送到SubGit镜像时会发生什么:

    master

    SubGit发现$ git push origin master 已从master映射到0e39ad2更新为映射到trunk@9的{​​{1}}。 SubGit无法做到,只需删除ca3caf9并从branches/foo@10重新创建,这显然会导致替换trunk

  3. 因此我们确保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选项:

    Branches Mapping

    文本字段应如下所示:

    $ git merge --no-ff foo
    

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