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

时间:2013-03-18 10:15:08

标签: git svn dcommit

背景

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

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

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

master(连接到project / branches / X)已重命名为master-X

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

问题

当我在master-X本地分支上git svn dcommit时,会创建一个新的“主”分支,效果与我一样:

git svn dcommit
git co master-X -b 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

最后三行是我添加的。

1 个答案:

答案 0 :(得分:1)

这是旧的Git行为,已在最近的Git版本中得到修复。比Git 1.7.12更新的东西将不再自动重新创建主分支。您可以运行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