[英]Git-svn wants to dcommit my local master to a remote branch, not trunk
[英]git svn dcommit on local branch re-creates local master
背景 :
我们的团队需要连接到svn服务器并在特定分支(而不是svn中继)上工作。 最重要的是,我们还需要获取主干并在它们之间合并。
我已经建立了连接到我们分支的本地git仓库(“ svn + ssh ... project / branches / X”)。
然后,我手动将中继添加为新的svn连接(“ svn + ssh ... project / trunk”)(我将svn中继的新远程目标添加到了.git / config),并按如下方式重命名了我的分支:
主机(连接到项目/分支/ X)已重命名为主机-X
连接到项目/主干的分支被重命名为主干。
问题 :
当我在master-X本地分支上git svn dcommit
,将创建一个新的“ master”分支,其效果与我所做的相同:
git svn dcommit
git co master-X -b master
我可以防止重新创建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
最后三行是我添加的。
这是旧的Git行为,在最近的Git版本中已修复。 比Git 1.7.12更新的版本将不再自动重新创建master分支。 您可以运行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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.