git-svn --ignore-paths

时间:2011-10-05 23:03:00

标签: git

我现在用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中指定的路径上的提取。

感谢。

7 个答案:

答案 0 :(得分:29)

我今天遇到同样的问题:我的正则表达式永远不会匹配...... 确保您知道目标路径实际上是什么样的。我对正在使用正则表达式的路径的结构做出了错误的假设。

为了找出路径的样子,在测试时将git-svn输出到控制台的每个路径

注意:以防万一,首先制作git-svn文件的备份副本!

  1. 在文本编辑器中打开git-svn脚本。我的剧本是 <git-dir>/libexec/git-core/git-svn
  2. 找到is_path_ignored子例程。
  3. 在第一个print语句上方添加return语句,如下所示......
  4. 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])”