我正在使用 git-svn 来处理 svn 存储库。gitmaster
分支正在镜像 svntrunk
分支(唯一使用的 svn 分支),即主分支和主干分支上的元素之间存在一对一的关系。
我想拥有与 svn 修订版相对应的 git 标签,这样我就可以做一些事情,例如git diff r123 workbranch
查看与 svn 修订版 123 相比我所做的事情。
当我这样做时,修订没有被标记git svn rebase
,所以我创建了以下我在 svn rebase 后运行的脚本:
#!/usr/bin/perl
use strict;
use warnings;
open(PIPE, "git log master |");
# Format for the pipe output:
# ...
# commit 6b24b8fdc6a25d35b01140dc1ac054697133423d
# ...
# git-svn-id: https://server.example.com/svn/project/trunk@594 164096ca-3471-41d1-a9ce-9541462a8c31
# ...
my $commit = "";
my $i = 0;
foreach my $line (<PIPE>) {
if ($line =~ /^commit ([\da-f]+)/) {
$commit = $1;
next;
}
next unless $line =~ /^\s+git-svn-id: .*\/trunk\@(\d+) /;
my $git_svn_id = $1;
run("git", "tag", "-f", "r$git_svn_id", $commit);
last if $i++ == 20;
}
close(PIPE);
sub run {
print join(' ', @_), "\n";
return system(@_);
}
这个脚本完成了工作,但是我每次都必须手动运行它,并且我(任意)在检查最后 21 个修订时对其进行了限制,因此理论上存在遗漏一些的风险(但我会从印刷中看到) .
问题:有什么方法可以自动化这个,这样我就可以运行git svn rebase
并且所有导入的修订都将在 git 中标记?我可以使用任何挂钩吗?
PS 是的,我知道 svn find-rev,但我绝对不想编写复杂的命令,git diff $(git svn find-rev r123) $(git svn find-rev r124)
而不仅仅是git diff r123 r124
.