推送时 Jira Subversion Mirror / SubGit 远程错误
Jira Subversion Mirror / SubGit remote error on push
因此,使用带有最新 BitBucket (4.8.3) 的 Subversion 镜像 (SubGit)。 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 版本 3.2.1 和 SVN Mirror 插件版本 3.3.0 中引入的。
SubGit/SVN Mirror 拒绝推送操作,这会导致 Subversion 存储库中的分支替换。基本上有两种情况 Git 更改可能导致 SVN 端的替换:
强制推送。
当一个人强行推送非快进更新时,SubGit/SVN Mirror 除了删除分支的当前版本并从某个旧版本重新创建它之外别无他法,因为这正是非快进更新快进更新确实:从分支提示以外的提交继续分支历史。
从一个分支快进合并到另一个分支。
从 master
创建新分支 foo
时:
$ 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 merge
在 master
上没有发现新的提交,因此不需要创建合并提交,即 git merge
只是从旧提交 [=27] 移动了 master
指针=] 到较新的 ca3caf9
.
现在将 master
推到 SubGit 镜像时会发生什么:
$ git push origin master
SubGit 发现 master
从 0e39ad2
映射到 trunk@9
更新为 ca3caf9
映射到 branches/foo@10
。 SubGit 只能删除 trunk
并从 branches/foo@10
重新创建它,这显然会导致替换 trunk
.
因此我们确保 SubGit 在这两种情况下不会替换分支,除非 SubGit 管理员明确设置以下配置选项:
$ edit REPO/subgit/config
...
[svn]
allowBranchReplacement = true
...
$ subgit install REPO
但是,我建议将 svn.allowBranchReplacement
设置为 false
并遵循这些最佳实践以避免原始问题中报告的错误消息:
切勿强行推动任何东西;更喜欢合并、恢复分支更改而不是覆盖它们。
将一个分支合并到另一个分支时添加 --no-ff
选项:它强制 git merge
创建一个合并提交,否则它宁愿进行快进更新:
$ git merge --no-ff foo
更新:
如果您使用的是 SVN Mirror 插件,您可以在 Branches Mapping 选项卡中指定 svn.allowBranchReplacement
选项:
文本字段应如下所示:
[svn]
trunk = ...
...
allowBranchReplacement = true
然后单击 应用更改 按钮以激活此新设置。
因此,使用带有最新 BitBucket (4.8.3) 的 Subversion 镜像 (SubGit)。 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 版本 3.2.1 和 SVN Mirror 插件版本 3.3.0 中引入的。
SubGit/SVN Mirror 拒绝推送操作,这会导致 Subversion 存储库中的分支替换。基本上有两种情况 Git 更改可能导致 SVN 端的替换:
强制推送。
当一个人强行推送非快进更新时,SubGit/SVN Mirror 除了删除分支的当前版本并从某个旧版本重新创建它之外别无他法,因为这正是非快进更新快进更新确实:从分支提示以外的提交继续分支历史。
从一个分支快进合并到另一个分支。
从
master
创建新分支foo
时:$ 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 merge
在master
上没有发现新的提交,因此不需要创建合并提交,即git merge
只是从旧提交 [=27] 移动了master
指针=] 到较新的ca3caf9
.现在将
master
推到 SubGit 镜像时会发生什么:$ git push origin master
SubGit 发现
master
从0e39ad2
映射到trunk@9
更新为ca3caf9
映射到branches/foo@10
。 SubGit 只能删除trunk
并从branches/foo@10
重新创建它,这显然会导致替换trunk
.
因此我们确保 SubGit 在这两种情况下不会替换分支,除非 SubGit 管理员明确设置以下配置选项:
$ edit REPO/subgit/config
...
[svn]
allowBranchReplacement = true
...
$ subgit install REPO
但是,我建议将 svn.allowBranchReplacement
设置为 false
并遵循这些最佳实践以避免原始问题中报告的错误消息:
切勿强行推动任何东西;更喜欢合并、恢复分支更改而不是覆盖它们。
将一个分支合并到另一个分支时添加
--no-ff
选项:它强制git merge
创建一个合并提交,否则它宁愿进行快进更新:$ git merge --no-ff foo
更新:
如果您使用的是 SVN Mirror 插件,您可以在 Branches Mapping 选项卡中指定 svn.allowBranchReplacement
选项:
文本字段应如下所示:
[svn]
trunk = ...
...
allowBranchReplacement = true
然后单击 应用更改 按钮以激活此新设置。