8

我正在尝试执行 git-svn 克隆以将 SVN 中的所有文件导入 GIT。给出的命令是这样的;

git svn clone --stdlayout --ignore-paths='(/cache|/tmps|/file/conf/setting.xml)' --authors-file=../authors.txt file:///svnFolder/local-repos/PRG PRG.git

上述克隆,但问题是它忽略了所有具有缓存和 tmps 的文件和文件夹。例如,它甚至会忽略这些

new/folder/cache
meta/files/sets/tmps.html

谁能帮我设置正则表达式以在忽略路径中忽略根文件夹的缓存和 tmps 目录中的文件和子目录。

4

2 回答 2

14

您的忽略路径正则表达式过于笼统。提供的正则表达式在完整路径上运行。例如,如果您的存储库布局是:

svn_root/path/to/your_project

然后有一个标准的主干、分支和标签布局,一组被评估的示例路径线可能是:

svn_root/path/to/your_project/trunk/new/folder/cache
svn_root/path/to/your_project/trunk/meta/files/sets/tmps.html
svn_root/path/to/your_project/trunk/file/conf/setting.xml
svn_root/path/to/your_project/trunk/cache/...
svn_root/path/to/your_project/trunk/tmps/...

让我们首先分析您作为 ignore-paths 参数的一部分提供的正则表达式:

'(/cache|/tmps|/file/conf/setting.xml)'
  1. 周围的括号表示其中的表达式应该是 capture
  2. 管道或交替表示从几个可能的表达式中评估目标字符串上的每个表达式
  3. 每个表达式都非常简单,但让我们分析一下:
    • /缓存
      1. 查找文字字符“/”
      2. 查找文字字符“c”
      3. 查找文字字符“a”
      4. 查找文字字符“c”
      5. 查找文字字符“h”
      6. 查找文字字符“e”
    • /tmps
      1. 查找文字字符“/”
      2. 查找文字字符“t”
      3. 查找文字字符“m”
      4. 查找文字字符“p”
      5. 查找文字字符“s”
    • /file/conf/setting.xml
      1. 查找文字字符“/”
      2. 查找文字字符“f”
      3. 查找文字字符“i”
      4. 查找文字字符“l”
      5. 查找文字字符“e”
      6. 查找文字字符“/”
      7. 查找文字字符“c”
      8. 查找文字字符“o”
      9. 查找文字字符“n”
      10. 查找文字字符“f”
      11. 查找文字字符“/”
      12. 查找文字字符“s”
      13. 查找文字字符“e”
      14. 查找文字字符“t”
      15. 查找文字字符“t”
      16. 查找文字字符“i”
      17. 查找文字字符“n”
      18. 查找文字字符“g”
      19. 匹配(几乎)任何字符
      20. 查找文字字符“x”
      21. 查找文字字符“m”
      22. 查找文字字符“l”

分析您的正则表达式后,让我们用您的表达式浏览上面给出的示例路径:

要评估的字符串:

svn_root/path/to/your_project/trunk/new/folder/cache
  1. 遍历每个字符以查找文字“/”,然后是“c”等...直到找到与您的第一个子表达式“/cache”的完全匹配。此路径被忽略。

要评估的字符串:

svn_root/path/to/your_project/trunk/meta/files/sets/tmps.html
  1. 遍历每个字符以查找文字“/”,然后是“c”等...找不到匹配项
  2. 遍历每个字符以查找文字“/”,然后是“t”等...直到找到与您的第二个子表达式“/tmps”的完全匹配。此路径被忽略。

要评估的字符串:

svn_root/path/to/your_project/trunk/file/conf/setting.xml
  1. 循环遍历每个字符并针对第一个子表达式进行评估。未找到匹配项
  2. 循环遍历每个字符并针对第二个子表达式进行评估。未找到匹配项
  3. 循环遍历每个字符并针对最后一个子表达式进行评估。找到匹配。此路径被忽略

从这里,您大概可以看到为什么以下两个也被忽略了。其中一个子表达式匹配每个路径的一部分:

svn_root/path/to/your_project/trunk/cache/...
svn_root/path/to/your_project/trunk/tmps/...

有几种方法可以解决这个问题,但如果你只是试图忽略主干中的几个特定目录,你可以修改你的表达式如下:

'(trunk/cache|trunk/tmps|/file/conf/setting\.xml)'

这实际上取决于您要做什么,要忽略哪些特定路径。如果您需要更多帮助,是否可以详细说明您的存储库的布局方式以及哪些目录将被忽略。

于 2013-07-31T14:35:09.823 回答
1

添加行首标记怎么样?

 ... --ignore-paths='^(/cache|/tmps|/file/conf/setting.xml)' ...
于 2013-03-19T15:21:25.003 回答