背景:
我们的团队需要连接到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
最后三行是我添加的。
答案 0 :(得分:1)
这是旧的Git行为,已在最近的Git版本中得到修复。比Git 1.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();
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。