1

背景

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

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

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

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

连接到 project/trunk 的分支被重命名为 master-trunk。

问题

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

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

最后三行是我添加的。

4

1 回答 1

1

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

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

但是,如果您愿意,您应该能够自己进行更改。git-svn在您的系统上找到or的副本git-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子程序中……</p>

    • 在开头的行上方添加以下行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。

于 2013-03-21T11:39:08.150 回答