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

标签 git svn bitbucket subgit

因此,使用带有最新 BitBucket (4.8.3) 的 Subversion 镜像 (SubGit)。 master 有两个变化。一种是直接制作的,另一种是通过功能分支的 merge 制作的。推送更改时,出现 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'

我确信我过去曾这样做过,而且效果很好。我会尝试返回并再次执行此操作,但只是想知道其他人是否已经看到此错误并知道它意味着什么。

谢谢,

布 pull 德

最佳答案

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

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

  1. 强制推送。

    当一个人强行推送非快进更新时,SubGit/SVN Mirror 除了删除分支的当前版本并从一些旧版本重新创建它之外别无他法,因为这正是非快进更新确实:从分支提示以外的提交继续分支历史。

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

    当创建一个新分支时 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 .

    最后,一个 merge 分支foo返回master :

    $ git checkout master
    $ git merge foo
    Updating 0e39ad2..ca3caf9
    Fast-forward
    

    注意到正在更新...快进消息了吗?这意味着 git mergemaster 上没有发现新的提交,因此不需要创建 merge 提交,即 git merge刚刚移动了 master来自旧提交的指针 0e39ad2换一个新的ca3caf9 .

    现在按下 master 会发生什么?到 SubGit 镜像:

    $ git push origin master
    

    SubGit 发现 master0e39ad2 更新映射到 trunk@9ca3caf9映射到 branches/foo@10 . SubGit 只能删除 trunk。并从 branches/foo@10 重新创建它这显然会导致替换 trunk .

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

$ edit REPO/subgit/config
...
[svn]
    allowBranchReplacement = true
...
$ subgit install REPO

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

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

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

    $ git merge --no-ff foo
    

更新:

如果您使用的是 SVN Mirror 附加组件,您可以指定 svn.allowBranchReplacement Branches Mapping 选项卡中的选项:

Branches Mapping

文本字段应如下所示:

[svn]
    trunk = ...
    ...
    allowBranchReplacement = true

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

关于git - 推送时 Jira Subversion Mirror/SubGit 远程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38926427/

相关文章:

git - Accurev 工作原理的一句话解释是什么?

git - 警告 : buildx: failed to read current commit information with git rev-parse --is-inside-work-tree

svn - 在 Subversion 中,我知道文件何时被添加,找出文件何时被删除的最快方法是什么?

Git子模块困惑

git - 如何删除 Bitbucket 中最新的 Git 提交?

git - 如何在 GitHub 页面上启用目录索引

git - jenkins:git fetch 返回状态代码 128: "object file ... is empty"

svn - TortoiseSVN 将文件标记为冲突,但在 TortoiseMerge 中看不到冲突

eclipse - Eclipse 中的 TFS 挂起更改窗口等效项

git 服务器端 'update' Hook 在 bitbucket 中