本地分支上的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 连接到project/trunk的分支已重命名为master trunk 问题: 在master-X本地分支上执行I本地分支上的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 连接
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”);
- 在开始的行上方添加以下行