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

时间:2013-03-19 14:31:21

标签: regex git git-svn ignore

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

任何人都可以帮我设置正则表达式,在ignore-paths中给出忽略根文件夹缓存和tmps目录中的文件和子目录。

2 个答案:

答案 0 :(得分:11)

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

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. 周围的括号表示should be capturing
  2. 中的表达式
  3. 管道或alternation表示从几个可能的表达式中评估目标字符串上的每个表达式
  4. 每个表达都非常简单,但让我们分析每个:
    • /高速缓存
      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”
  5. 分析了正则表达式后,让我们使用您的表达式遍历上面给出的示例路径:

    要评估的字符串:

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

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

        svn_root/path/to/your_project/trunk/file/conf/setting.xml
        
        1. 遍历每个字符并针对第一个子表达式进行评估。找不到匹配项
        2. 遍历每个字符并针对第二个子表达式进行评估。找不到匹配项
        3. 遍历每个字符并针对最后一个子表达式进行评估。找到匹配。忽略此路径
        4. 从这里,您可以看到为什么以下两个也被忽略。其中一个子表达式匹配每个路径的一部分:

          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 :(得分:1)

如何添加行首标记?

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