【问题标题】:git-svn --ignore-pathsgit-svn --忽略路径
【发布时间】:2011-10-05 23:03:00
【问题描述】:

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

谢谢。

【问题讨论】:

  • 您是否尝试将“/dev/Acme-4.x”作为被忽略的路径?或者只是一个像“dev/Acme”这样的忽略路径,有点像这个测试:mirrors.kilnhg.com/Repo/Mirrors/From-Git/Git/File/t/…
  • 这个忽略路径 (dev/tags/Acme-4.x) 不会忽略 Acme-4.x,这个 (dev/Acme-4.x) 也不会。我看不出第二个如何忽略路径,即使忽略有效:我想忽略的路径包含“tags/”作为路径元素。
  • 对不起,我的意思是 tags/Acme 不是 dev
  • 没问题。我也是这么想的。这也不起作用:git svn fetch --ignore-paths="tags/Acme-4.x"。一个真正令人头疼的问题,因为我使用 Perl 测试台脚本证明了正则表达式。给定 fetch 遇到的路径,我的测试平台脚本会过滤正确的路径。
  • 记得使用\。正则表达式中的文字句点

标签: git


【解决方案1】:

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

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

注意:以防万一,请先备份 git-svn 文件!

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

现在通过--ignore-paths 开关再次使用git-svn

我意识到它实际上不是使用trunk/baz 这样的路径,而是使用bar/trunk/baz

所以不是

--ignore-paths='^(?:trunk|branches|tags)/baz' 

我需要使用

--ignore-paths='^bar/(?:trunk|branches|tags)/baz'

不要忘记从 git-svn 脚本中删除 print 语句。

【讨论】:

  • 在较新版本的 git 中,此子例程已移至 Git::SVN::Fetcher 模块,该模块可在 Ubuntu 和 Fedora 的 /usr/share/perl5/Git/SVN/Fetcher.pm 中找到.
  • 那么路径相对于什么?存储库根目录?
  • 在 OSX Yosemite 上,我在 /Applications/Xcode.app/Contents/Developer/usr/share/git-core/perl/Git/SVN/Fetcher.pm 找到了这个例程
  • 在windows上我在C:\Program Files (x86)\Git\lib\perl5\site_perl\Git\SVN\Fetcher.pm找到它
  • @JanHudec 路径似乎是相对于在命令行中指定的任何存储库 URL,没有前导斜杠。
【解决方案2】:

我将这篇文章发布给所有试图使用 --ignore-paths 仅获取特定分支/标签的人...

经过一段时间与 --ignore-paths 的斗争,导致以下模式忽略了分支文件夹中的所有文件夹,除了文件夹 branchname1branchname2

--ignore-paths='branches/(?!branchname1|branchname2)'

但是,正确的解决方案是隐藏在GIT SVN documentation的底部:

也可以通过使用 大括号内以逗号分隔的名称列表。例如:

[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】:

    你也可以试试:

    cat .git/config
    

    在 Linux 上,或:

    type .git\config
    

    在 Windows 上,从您的新存储库目录中查看获取 URL、分支和标签 url。

    【讨论】:

      【解决方案4】:

      有人愿意评论一下为什么不使用正则表达式吗 抑制在 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】:

        我有一个类似的问题和我的案例的部分解决方案.. .

        上下文:
        我们只有一个用于 Meca、硬件、软件团队的 SVN 存储库……存储库一团糟……所以我尝试使用正则表达式来减少扫描区域。 1天后我就放弃了。

        最后,我使用包含路径选项仅扫描内部带有“*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) --ignore-paths 可以为 git svn [init/fetch or clone] 提供(我不知道是否有不同的行为)
        2) --ignore-paths 需要一个正则表达式,小心“。”表示任何字符。碰巧是“。”也是任何字符 所以 regex=Acme-5.0 将匹配 string="Acme-5.0" 但也匹配 string="Acme-580",无论如何它应该可以工作。

        【讨论】:

          【解决方案6】:

          我一直在努力解决完全相同的问题,并开始编辑 .git/config 以明确列出我想要的分支或标签。

          这种方法效果很好,直到我遇到一个有很多分支的 svn 存储库,所以我适当地添加了我想要的那些,而忽略了我没有的那些。但这因配置文件错误而失败。试验和错误显然表明配置文件中的分支数量或更可能是开始 { 和结束 } 之间的字符总数存在限制。

          如果我可以构建正则表达式,我的生活会轻松很多。

          【讨论】:

            【解决方案7】:

            我也遇到了 --ignore-paths 的奇怪问题。在某些情况下,git-svn 似乎忽略了整个正则表达式。我在 repos 1 上看到了相同的正则表达式,但在 repos 2 上被忽略了,其中两个 repos 具有相同的文件结构,但历史记录不同。

            虽然我没有看到您的特定树的正则表达式有任何问题,但我建议在开头使用 ^ 插入符号来指定从根开始的忽略路径。这可能有助于 rexexp 解析器加快搜索速度并避免例如在树干深处也可以找到匹配项的问题。

            我会使用类似 --ignore-paths="^tags/Acme-(4|5.[0-4])" 的东西

            【讨论】:

              猜你喜欢
              • 2011-10-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多