本地分支上的git svn dcommit重新创建本地主机

本地分支上的git svn dcommit重新创建本地主机,git,svn,dcommit,Git,Svn,Dcommit,背景: 我们的团队需要连接到svn服务器并在特定的分支(而不是svn主干)上工作。在上面,我们还需要得到主干并在它们之间合并 我已经建立了一个连接到分支的本地git存储库(“svn+ssh…project/Branchs/X”) 然后,我手动将主干添加为新的svn连接(“svn+ssh…project/trunk”)(我为svn主干添加了一个新的远程目标,即.git/config),并将我的分支重命名如下: master(连接到project/Branchs/X)已重命名为master-X 连接

背景

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

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

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

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

连接到project/trunk的分支已重命名为master trunk

问题

在master-X本地分支上执行I
git svn dcommit
操作时,将创建一个新的“master”分支,其效果与我执行的相同:

git svn dcommit
git co master-X -b master
我可以阻止重新创建主分支吗

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

编辑

My.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版本中已经修复。任何比Git1.7.12更新的版本都不会再自动重新创建主分支。您可以运行
git--version
,以获取当前运行的git版本

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

然而,如果你想,你应该能够自己做出改变。在您的系统上找到
git svn
git svn.perl
的副本(在我的系统上,它是
/usr/lib/git core/git svn
),然后进行以下更改:

  • Git::SVN::init_vars()下面,移动
    post_fetch_checkout()右大括号前的行,因此代码位如下所示:

    Git::SVN::init_vars();
    评估{
    Git::SVN::验证_remotes_sanity();
    $cmd{$cmd}->[0]->(@ARGV);
    post_fetch_checkout();
    };
    致命$@如果$@;
    出口0;
    
  • post\u fetch\u checkout
    子例程中

    • 在开始的行上方添加以下行
      my$gs=

      verify_ref('HEAD ^0')时返回;
      
    • 删除如下所示的行:

      verify\u ref('refs/heads/master ^0')返回
      
    • 更换以下线路:

      my$valid\u head=verify\u ref('head^0');
      命令(qw(更新参考文件/heads/master),$gs->refname);
      返回if($valid_head | |!verify_ref('head ^0'));
      
      以下是:

      command_noised(qw(更新参考头),$gs->refname);
      返回,除非验证参考(“头^0”);
      

上述更改将应用在Git源代码中更改此行为的修补程序。您可以自己看到:相关的提交由Marcin Owsiany完成。

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

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

然而,如果你想,你应该能够自己做出改变。在您的系统上找到
git svn
git svn.perl
的副本(在我的系统上,它是
/usr/lib/git core/git svn
),然后进行以下更改:

  • Git::SVN::init_vars()下面,移动
    post_fetch_checkout()右大括号前的行,因此代码位如下所示:

    Git::SVN::init_vars();
    评估{
    Git::SVN::验证_remotes_sanity();
    $cmd{$cmd}->[0]->(@ARGV);
    post_fetch_checkout();
    };
    致命$@如果$@;
    出口0;
    
  • post\u fetch\u checkout
    子例程中

    • 在开始的行上方添加以下行
      my$gs=

      verify_ref('HEAD ^0')时返回;
      
    • 删除如下所示的行:

      verify\u ref('refs/heads/master ^0')返回
      
    • 更换以下线路:

      my$valid\u head=verify\u ref('head^0');
      命令(qw(更新参考文件/heads/master),$gs->refname);
      返回if($valid_head | |!verify_ref('head ^0'));
      
      以下是:

      command_noised(qw(更新参考头),$gs->refname);
      返回,除非验证参考(“头^0”);
      
上述更改将应用在Git源代码中更改此行为的修补程序。你可以自己看到:相关的提交由Marcin Owsiany完成