我正在使用SVN并且拥有稳定的生产分支和不稳定的主干。 对于每个版本,我们都会从主干中选择要合并到生产中的项目。
我用git svn克隆了我的SVN repo,这样我就可以利用更快的搜索需要合并的提交(因为我在提交消息中搜索JIRA id)。但是,我仍然在最后使用svn merge进行合并。
这个长期存在的生产分支的一个问题是,主干中可能存在未提交合并的提交。
为了解决这个问题,我偶尔会跑:
svn mergeinfo --show-revs eligible https://my.server/svn/trunk https://my.server/svn/branches/PROD_V3.00
然而,这真的很慢。 git中的等价物是
git log prod..master
但是,这似乎只列出了所有提交。
这是因为git无法识别svn merges和svn:mergeinfo属性吗?
我有什么方法可以使用git快速获得符合条件的提交吗?
修改
我试过Joes回答,但是,git cherry
只输出SHA,我需要SVN修订才能进行合并。
因此,我不得不通过git svn find-rev
通过它来找到SVN ID以获得我需要的东西。
git cherry prod master|cut -d' ' -f2|while read -r line; do git svn find-rev "$line"; done;
不幸的是,这比svn mergeinfo --show-revs eligible
慢。
答案 0 :(得分:3)
如果提交已被挑选出来,那么您现在拥有这些提交的两个副本。 Git会在master
中显示所有提交,即使他们在prod
中有副本。
等效物可能是:
git cherry master prod
会向您显示master
中的所有提交内容,这些提交似乎未被挑选到prod
。
答案 1 :(得分:1)
如果你完全可以在Perl中工作,git-svn只是一个很大的perl脚本,而git svn find-rev是perl脚本中的一个函数。您可以使用它进行编码,这样可以避免每次都读取rev_map文件。
所以,我在想的是:
git cherry prod master|cut -d' ' -f2|while read -r line; do git svn find-rev "$line"; done
变成更像这样的东西(不完整且没有运行b / c我不再有git-svn回购):
#!/usr/bin/perl
use Carp;
use Git::SVN;
# use ...the rest of the Git::SVN module...
# ...initialize whatever is necessary...
open(ELIGIBLE_COMMITS, "git cherry prod master") || croak "Couldn't do git cherry";
while (<ELIGIBLE_COMMITS>) {
($ignore, $sha1) = split;
my (undef, $rev, undef) = cmt_metadata($sha1);
print "$rev\n";
}
close(ELIGIBLE_COMMITS);
您也可以考虑修改git-svn
脚本cmd_find_rev
以采取额外的选项,指定要查找的多个修订版本,例如,
find-rev --file <filename>
文件名可以是&#34; - &#34;指定STDIN。