我现在用git-svn的--ignore-paths选项挣扎了好几个小时,试图只从大型存储库中获取某些标签。
我想在dev处启动fetch,看起来像是
> 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中指定的路径上的提取。
感谢。
答案 0 :(得分:29)
我今天遇到同样的问题:我的正则表达式永远不会匹配...... 确保您知道目标路径实际上是什么样的。我对正在使用正则表达式的路径的结构做出了错误的假设。
为了找出路径的样子,在测试时将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'
不要忘记从git-svn脚本中删除print
语句。
答案 1 :(得分:5)
您也可以尝试:
cat .git/config
在Linux上,或者:
type .git\config
在Windows上,从新的存储库目录中查看获取URL,分支和标记URL。
答案 2 :(得分:5)
我发布给每个人,他们也试图使用 - ignore-paths 来获取特定的分支/标签......
经过一段时间与 - ignore-paths 挣扎,导致以下模式忽略branches文件夹中的所有文件夹,文件夹 branchname1 和 branchname2除外:
--ignore-paths='branches/(?!branchname1|branchname2)'
然而,正确的解决方案隐藏在GIT SVN documentation:
的底部也可以使用a来获取分支或标记的子集 以逗号分隔的大括号内的名称列表。例如:
[svn-remote "huge-project"] url = http://server.org/svn fetch = trunk/src:refs/remotes/trunk branches = branches/{red,green}/src:refs/remotes/project-a/branches/* tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*
所以在你的情况下, .git / config 应该包含这样的内容:
tags = tags/{Acme-4.x,Acme-5.0,Acme-5.1,Acme-5.2,Acme-5.3,Acme-5.4}:refs/remotes/origin/tags/*
答案 3 :(得分:3)
我有一个类似的问题和我案例的部分解决方案......
背景:
我们只有一个用于Meca,硬件,软件团队的SVN存储库...存储库完全混乱..所以我尝试使用正则表达式来减少要扫描的区域。
一天后我就放弃了。
最后,我使用include-path选项仅扫描内部带有“* Src *”的文件夹。这加快了扫描速度。
也可以使用选项:
-r减少您在当地获得的历史规模
--no-minimize-url否则git-svn将扫描整个存储库,即使您指定了主干和分支位置。
git svn clone
-r11213:HEAD
--prefix svn/
--no-minimize-url
--trunk=/trunk/dev/SW/Code/Controller1
--branches=/branches/SW_team/
--include-paths=.*Src.*
https://svnserver.compagny.com/Project1/
Controller1__git__
请注意,我现在不关心标签。
希望它可以提供帮助,即使这不是原始问题(5年前:-))
编辑:我无法添加评论,所以我在这里评论问题(信誉点不够) 1) - 可以为git svn [init / fetch或clone]提供--ignore-paths(我不知道是否有不同的行为)
2)--ignore-paths期望正则表达式,小心“。”意味着任何角色。偶然的机会“。”也是任何角色
所以regex = Acme-5.0将匹配string =“Acme-5.0”但也匹配string =“Acme-580”,无论如何都应该有效。
答案 4 :(得分:2)
有人会善意评论为什么正则表达式不是 抑制在ignores-regex中指定的路径上的提取。
此路径
ACME4.4/source/database/mssql/components/functions/vssver.scc
尽管有--ignore-paths
参数,仍然被提取,因为它与正则表达式不匹配。
此路径中“ACME”和“4.4”之间没有-
。
如果正则表达式区分大小写,则“ACME”将不匹配“Acme”。
这应该效果更好:
git svn fetch --ignore-paths="ACME4.x|ACME5.0|ACME5.1|ACME5.2|ACME5.3|ACME5.4"
请注意--ignore-paths
定位文件名,而不是标记。
(我打赌你很久以前解决了这个问题 - 这篇文章已经4年了。)
答案 5 :(得分:0)
我一直在努力解决完全相同的问题并开始编辑.git / config以明确列出我想要的分支或标签。
这种方法运作良好,直到我遇到一个有很多分支的svn存储库,所以我适当地添加了我想要的那些并省略了我没有的那些。但是配置文件错误导致失败。试验和错误显然表明配置文件中的分支数量有限制,或者更有可能是开头{和结束}之间的总字符数。
如果我能建立正则表达式,我的生活将会轻松得多。
答案 6 :(得分:0)
我也经历过--ignore-paths的奇怪问题。在某些情况下,git-svn似乎忽略了整个正则表达式。我在repos 1上看到了相同的正则表达式,并且在repos 2中被忽略,其中两个repos具有相同的文件结构,但历史记录不同。
虽然我没有看到你的特定树的正则表达式有任何问题,但我建议在开头使用^插入符号来指定从根开始的被忽略的路径。这可能有助于rexexp解析器加速搜索,并避免例如在主干内部也可以找到匹配的问题。
我会使用类似--ignore-paths =“^ tags / Acme-(4 | 5. [0-4])”