我正在使用git-svn与svn存储库一起使用。 git master分支正在镜像svn trunk分支(正在使用的唯一svn分支),即,master分支和主干分支上的元素之间存在一对一的关系。

我想拥有与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中标记?我可以使用任何hooks吗?

聚苯乙烯
是的,我知道svn find-rev,但是我绝对不需要写像git diff $(git svn find-rev r123) $(git svn find-rev r124)这样复杂的命令,而不仅仅是git diff r123 r124

最佳答案

这是个疯狂的主意:捕获bash命令并使用SHA哈希自动替换任何r1234字符串:

shopt -s extdebug

enhance_rev_parse () {
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    case "$BASH_COMMAND" in
    *r[0-9]*)
        eval $(echo "$BASH_COMMAND" | sed -e 's/r[0-9][0-9]*/$(git svn find-rev &)/g')
        return 1
        ;;
    esac
}

trap 'enhance_rev_parse' DEBUG

关于tags - git-svn:自动导入/创建svn版本作为git标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13740165/

10-14 17:08
查看更多