git-svn 克隆忽略路径正则表达式用于文件夹

10

我正在尝试使用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

请问有人能帮我设置正则表达式,在忽略路径中忽略根文件夹下缓存和临时目录中存在的文件和子目录。

2个回答

17
你需要注意忽略路径的正则表达式太过普遍了。给出的正则表达式是在完整路径上运行的。例如,如果你的仓库布局为:
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/...

让我们开始分析你提供的作为忽略路径参数一部分的正则表达式:

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

  1. 括号表示中的表达式应该捕获
  2. 管道符或交替项表示在多个可能的表达式中评估目标字符串上的每个表达式
  3. 每个表达式都非常简单,但让我们来分析一下:
    • /cache
      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
  • 通过循环遍历每个字符并与第一个子表达式进行匹配。没有匹配项
  • 通过循环遍历每个字符并与第二个子表达式进行匹配。没有匹配项
  • 通过循环遍历每个字符并与最后一个子表达式进行匹配。找到匹配项。此路径被忽略

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

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

有几种方法可以解决这个问题,但是如果你只想忽略版本库中的一些特定目录,你可以按照以下方式修改表达式:

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

这真的取决于你想要做什么,哪些特定路径你想要忽略。如果需要更多帮助,请详细说明你的存储库是如何布置的,以及哪些目录需要被忽略。


1
一个简单正则表达式的优秀解释。 - Martin

0

加一个行首标记怎么样?

 ... --ignore-paths='^(/cache|/tmps|/file/conf/setting.xml)' ...

这正是不起作用的事情,除非您知道它实际匹配的值,而您显然不知道(因为它不以斜杠开头,也不从分支开始)。-1。 - Jan Hudec
我的意思是让正则表达式更加具体和“锚定”它;在侮辱和否定答案之前,您也许应该重新阅读原始问题... - umläute
你仍然应该考虑到,自己遇到了类似的问题并不是将随机回答其他问题的答案投票为负的理由。 - umläute
我曾经遇到过同样的问题,如果不指明模式的锚定位置,这个建议是具有误导性的。是的,模式需要被锚定,但如果你不说清楚锚定的位置,它根本无法匹配。 - Jan Hudec
4
为了解决问题,必须锚定模式,但您还需要知道要将模式与什么匹配,否则根本无法匹配,这几乎不是解决方案。您发布了一个无法正常工作的示例,没有进一步的解释。这就是我所说的误导性答案。 - Jan Hudec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接