git-svn clone ignore-paths文件夹的正则表达式

zap*_*ing 8 regex git ignore git-svn

我试图做一个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
Run Code Online (Sandbox Code Playgroud)

上面的克隆但问题是它忽略了所有具有缓存和tmps的文件和文件夹.比如它甚至忽略了这些

new/folder/cache
meta/files/sets/tmps.html
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我设置正则表达式,在忽略路径中忽略根文件夹的缓存和tmps目录中的文件和子目录.

小智 12

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

svn_root/path/to/your_project
Run Code Online (Sandbox Code Playgroud)

然后有一个标准的主干,分支和标签布局,一组被评估的样本路径行可能是:

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

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

'(/cache|/tmps|/file/conf/setting.xml)'
Run Code Online (Sandbox Code Playgroud)
  1. 周围的括号表示其中的表达式应该是捕获.
  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. 找一个文字字符"我"
      4. 找一个字面字符"l"
      5. 找一个字面字符"e"
      6. 找一个文字字符"/"
      7. 找一个字面字符"c"
      8. 找一个字面字符"o"
      9. 找一个字面字符"n"
      10. 找一个字面字符"f"
      11. 找一个文字字符"/"
      12. 找一个文字字符"s"
      13. 找一个字面字符"e"
      14. 找一个字面字符"t"
      15. 找一个字面字符"t"
      16. 找一个文字字符"我"
      17. 找一个字面字符"n"
      18. 找一个字面字符"g"
      19. 匹配(几乎)任何角色
      20. 找一个字面字符"x"
      21. 找一个字面字符"m"
      22. 找一个字面字符"l"

在分析了正则表达式后,让我们使用您的表达式遍历上面给出的示例路径:

要评估的字符串:

svn_root/path/to/your_project/trunk/new/folder/cache
Run Code Online (Sandbox Code Playgroud)
  1. 循环遍历每个字符,查找文字"/",然后是"c"等,直到找到与您的第一个子表达式"/ cache"完全匹配.此路径被忽略.

要评估的字符串:

svn_root/path/to/your_project/trunk/meta/files/sets/tmps.html
Run Code Online (Sandbox Code Playgroud)
  1. 循环遍历每个字符,查找文字"/",然后是"c"等...找不到匹配项
  2. 循环遍历每个字符,查找文字"/",然后是"t"等,直到找到与第二个子表达式"/ tmps"的完全匹配.此路径被忽略.

要评估的字符串:

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

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

svn_root/path/to/your_project/trunk/cache/...
svn_root/path/to/your_project/trunk/tmps/...
Run Code Online (Sandbox Code Playgroud)

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

'(trunk/cache|trunk/tmps|/file/conf/setting\.xml)'
Run Code Online (Sandbox Code Playgroud)

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