我现在用 git-svn 的 --ignore-paths 选项苦苦挣扎了几个小时,试图从大型存储库中只获取某些标签。
我想在dev开始获取,看起来像
> svn ls http://192.168.0.2/svn/repo/corporation/dev
branches/
tags/
trunk/
完整标签集的存储库目录列表如下所示:
> svn ls http://192.168.0.2/svn/repo/corporation/dev/tags
Acme-4.x/
Acme-5.0/
Acme-5.1/
Acme-5.2/
Acme-5.3/
Acme-5.4/
Acme-5.5/
Acme-5.6/
Acme-5.7/
Acme-5.8/
Acme-5.9/
我想忽略 Acme-5.5 之前的所有标签。
我尝试这样初始化和获取:
> git svn init http://192.168.0.2/svn/repo/corporation/dev
> git config svn.authorsfile ../users.txt
> git svn fetch --ignore-paths="Acme-4.x|Acme-5.0|Acme-5.1|Acme-5.2|Acme-5.3|Acme-5.4"
不幸的是,我仍然看到在 Acme-4.x 标记中发生提取。提取通过诸如
之类的指示性路径显示在控制台上A ACME4.4/source/database/mssql/components/functions/vssver.scc
我尝试了正则表达式的一系列变体,包括我想忽略的标签的完整路径,一两个小时后,这变成了完全的正则表达式颠簸和绝望。我已经为 git-svn-init 提供了 --ignore-paths 选项,但都无济于事。
有人愿意评论一下为什么正则表达式不抑制在 ignores-regex 中指定的路径上的提取。
谢谢。
最佳答案
我今天遇到了同样的问题:我的正则表达式永远不会匹配... 确保您知道目标路径实际是什么样的。我对输入正则表达式的路径结构做出了错误的假设。
要找出路径的样子,让 git-svn 在测试它们时将每个路径输出到控制台:
注意:以防万一,请先备份 git-svn 文件!
- 在文本编辑器中打开 git-svn 脚本。我的脚本是
<git-dir>/libexec/git-core/git-svn
. - 找到
is_path_ignored
子程序。 - 添加
print
第一条上面的语句return
声明,如下……
sub is_path_ignored {
my ($self, $path) = @_;
print STDERR "$path\n"; //<-- **ADD THIS LINE**
return 1 if in_dot_git($path);
return 1 if defined($self->{ignore_regex}) &&
$path =~ m!$self->{ignore_regex}!;
return 0 unless defined($_ignore_regex);
return 1 if $path =~ m!$_ignore_regex!o;
return 0;
}
现在使用 git-svn
再次使用 --ignore-paths
开关。
我意识到,而不是像 trunk/baz
这样的路径它实际上是在使用 bar/trunk/baz
所以代替
--ignore-paths='^(?:trunk|branches|tags)/baz'
我需要使用
--ignore-paths='^bar/(?:trunk|branches|tags)/baz'
不要忘记删除 print
来自 git-svn 脚本的语句。
关于git-svn --ignore-paths,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668752/