繁体   English   中英

本地分支上的git svn dcommit重新创建本地主服务器

[英]git svn dcommit on local branch re-creates local master

背景

我们的团队需要连接到svn服务器并在特定分支(而不是svn中继)上工作。 最重要的是,我们还需要获取主干并在它们之间合并。

我已经建立了连接到我们分支的本地git仓库(“ svn + ssh ... project / branches / X”)。

然后,我手动将中继添加为新的svn连接(“ svn + ssh ... project / trunk”)(我将svn中继的新远程目标添加到了.git / config),并按如下方式重命名了我的分支:

主机(连接到项目/分支/ X)已重命名为主机-X

连接到项目/主干的分支被重命名为主干。

问题

当我在master-X本地分支上git svn dcommit ,将创建一个新的“ master”分支,其效果与我所做的相同:

git svn dcommit
git co master-X -b master

我可以防止重新创建master分支吗?

(每次创建它后,我都会手动将其删除)。

编辑

我的.git / config现在看起来像这样:

# original/default configuration settings skipped for brevity

[svn-remote "svn"]
    url = svn+ssh://...project/branches/X
    fetch = :refs/remotes/git-svn

[svn-remote "svn-trunk"]
    url = svn+ssh://...project/trunk
    fetch = :refs/remotes/git-svn-trunk

最后三行是我添加的。

这是旧的Git行为,在最近的Git版本中已修复。 比Git 1.7.12更新的版本将不再自动重新创建master分支。 您可以运行git --version来获取当前正在运行的Git的版本。

如果操作系统随附的版本早于1.7.12(在我的Debian,RHEL和Cygwin系统之间,我可以轻松访问的最新版本是1.7.9),那将没有太大用处。

但是,如果需要,您应该可以自己进行更改。 在您的系统上找到git-svngit-svn.perl的副本(在我的系统上是/usr/lib/git-core/git-svn ),然后进行以下更改:

  • Git::SVN::init_vars() ,移动post_fetch_checkout(); 到右括号之前的一行,所以这段代码看起来像这样:

     Git::SVN::init_vars(); eval { Git::SVN::verify_remotes_sanity(); $cmd{$cmd}->[0]->(@ARGV); post_fetch_checkout(); }; fatal $@ if $@; exit 0; 
  • post_fetch_checkout子例程中…

    • my $gs =开头的行上方添加以下行:

       return if verify_ref('HEAD^0'); 
    • 删除如下所示的行:

       return if verify_ref('refs/heads/master^0') 
    • 替换以下行:

       my $valid_head = verify_ref('HEAD^0'); command_noisy(qw(update-ref refs/heads/master), $gs->refname); return if ($valid_head || !verify_ref('HEAD^0')); 

      具有以下内容:

       command_noisy(qw(update-ref HEAD), $gs->refname); return unless verify_ref('HEAD^0); 

以上更改将应用​​在Git源代码中更改此行为的补丁。 您可以自己看到:相关的提交是Marcin Owsiany的v1.7.11.2-250- ge3bd4dd。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM