5

我正在使用 SVN,并且有一个稳定的生产分支和一个不稳定的主干。对于每个版本,我们都会从主干中挑选要合并到生产中的项目。

我已经用 git svn 克隆了我的 SVN 存储库,这样我就可以利用更快的搜索来搜索我需要合并的提交(因为我在提交消息中搜索 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 合并和 svn:mergeinfo 属性吗?

有什么方法可以让我使用 git 快速获得符合条件的提交?

编辑:

我尝试了乔斯的回答,但是,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.

4

2 回答 2

3

如果提交已被精心挑选,那么您现在拥有这些提交的两个副本。Git 会向您显示所有提交,master即使它们在prod.

等价的可能是:

git cherry master prod

这将向您显示任何master似乎没有被挑选到的提交prod

于 2013-03-23T07:06:44.933 回答
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>

其中文件名可以是“-”来指定 STDIN。

于 2014-12-19T16:07:01.293 回答