Git SVN可以运行svn mergeinfo --show-revs符合条件

时间:2013-03-22 21:32:42

标签: git svn git-svn

我正在使用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慢。

2 个答案:

答案 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。