git-svn --ignore-paths

ae6*_*6rt 23 git

我现在用git-svn的--ignore-paths选项挣扎了好几个小时,试图只从大型存储库中获取某些标签.

我想开始在dev的fetch,看起来像

> svn ls http://192.168.0.2/svn/repo/corporation/dev
branches/
tags/
trunk/
Run Code Online (Sandbox Code Playgroud)

完整标记集的存储库目录列表如下所示:

> 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/
Run Code Online (Sandbox Code Playgroud)

我想在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"
Run Code Online (Sandbox Code Playgroud)

不幸的是,我仍然看到Acme-4.x标签中出现了提取物.提取器通过告诉路径显示在控制台上

A       ACME4.4/source/database/mssql/components/functions/vssver.scc
Run Code Online (Sandbox Code Playgroud)

我在正则表达式上尝试了很多变种,包括我想要忽略的标记的完整路径,在一两个小时后变成完全正则表达式的颠簸和绝望.我已经为git-svn-init提供了--ignore-paths选项,但都无济于事.

有人会非常友好地评论为什么正则表达式不会抑制在ignores-regex中指定的路径上的提取.

谢谢.

stu*_*ell 30

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

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

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

  1. 在文本编辑器中打开git-svn脚本.我的剧本是 <git-dir>/libexec/git-core/git-svn.
  2. 找到is_path_ignored子例程.
  3. 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

而不是

--ignore-paths='^(?:trunk|branches|tags)/baz' 
Run Code Online (Sandbox Code Playgroud)

我需要使用

--ignore-paths='^bar/(?:trunk|branches|tags)/baz'
Run Code Online (Sandbox Code Playgroud)

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

  • 在较新版本的git中,这个子例程已经转移到Git :: SVN :: Fetcher模块,该模块可以在/usr/share/perl5/Git/SVN/Fetcher.pm中的Ubuntu和Fedora上找到. (10认同)
  • 那相对的路径是什么?存储库根目录? (4认同)
  • 在Windows上我发现它在`C:\ Program Files(x86)\ Git\lib\perl5\site_perl\Git\SVN\Fetcher.pm` (4认同)

Tou*_*ghy 5

您也可以尝试:

cat .git/config
Run Code Online (Sandbox Code Playgroud)

在Linux上,或:

type .git\config
Run Code Online (Sandbox Code Playgroud)

在Windows上,从新的存储库目录,查看获取URL,分支和标记URL.


小智 5

我正在为每个人发布这个,他们也试图使用--ignore-paths来获取特定的分支/标签......

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

--ignore-paths='branches/(?!branchname1|branchname2)'
Run Code Online (Sandbox Code Playgroud)

然而,正确的解决方案隐藏在GIT SVN文档的底部:

也可以通过在大括号内使用逗号分隔的名称列表来获取分支或标记的子集.例如:

[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/*
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,.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/*
Run Code Online (Sandbox Code Playgroud)


小智 1

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

这种方法很有效,直到我遇到一个有很多分支的 svn 存储库,所以我适当地添加了我想要的分支,并省略了我不需要的分支。但由于配置文件错误而失败。试验和错误显然表明配置文件中的分支数量或者更可能是开头 { 和结尾 } 之间的字符总数受到限制。

如果我可以构建正则表达式,我的生活会容易得多。