KDE svn2git多文件夹匹配规则正确性及Git目录创建问询
我的SVN目录结构
- Project A
- Folder 1
- Folder a
- Folder b
- Folder 1
- trunk
- tags
- ...
- Folder n
- trunk
- tags
- Folder 1
- Folder 2
- Folder 3
- Folder 1
- Project B
我编写的KDE svn2git匹配规则
create repository repo end repository match Project A/Folder 1/Folder b/([^/]+)/trunk/([^/]+)/ repository repo/Project A/Folder b/([^/]+) branch master end match # Add a prefix to all tag branches so we can fix them later. match Project A/Folder 1/Folder b/([^/]+)/tags/([^/]+)/ repository repo/Project A/Folder b/([^/]+) branch tag--\1 end match # Ignore all other directories. match / end match
我的疑问
- 请问上述svn2git匹配规则是否正确?
- 是否需要提前在Git仓库中创建所有文件夹,还是svn2git会自动创建?
解答
一、关于svn2git匹配规则的正确性
咱们先明确你的规则目标:把Project A/Folder 1/Folder b下的每个子文件夹(比如Folder 1到Folder n)里的trunk和tags,分别映射到Git仓库repo/Project A/Folder b/对应子文件夹的master分支和带前缀的tag分支,同时忽略其他目录。这个思路是对的,但规则里有几个细节需要调整:
trunk的匹配范围问题:你写的
match Project A/Folder 1/Folder b/([^/]+)/trunk/([^/]+)/会要求trunk下面必须有至少一层子目录才能匹配,如果trunk本身就是存放文件的根目录(比如trunk/直接有文件),这个规则就会漏掉。建议改成match Project A/Folder 1/Folder b/([^/]+)/trunk(/.*)?$,这样不管trunk下有没有子目录,都能被正确匹配到。tag分支的变量引用错误:在tag规则里,你用了
branch tag--\1,但这里的\1对应的是第一个捕获组(也就是Folder 1、Folder n这类子文件夹的名称),而你实际想要捕获的是tags下面的具体标签名(第二个捕获组([^/]+)),所以应该改成branch tag--\2,不然所有标签都会被命名为tag--Folder1,而不是你想要的tag--实际标签名。repository路径的简化:你写的
repository repo/Project A/Folder b/([^/]+)可以简化成repository repo/Project A/Folder b/\1,用捕获组引用代替重复的正则,更简洁也不容易出错。
修正后的规则参考:
create repository repo end repository match Project A/Folder 1/Folder b/([^/]+)/trunk(/.*)?$ repository repo/Project A/Folder b/\1 branch master end match # Add a prefix to all tag branches so we can fix them later. match Project A/Folder 1/Folder b/([^/]+)/tags/([^/]+)(/.*)?$ repository repo/Project A/Folder b/\1 branch tag--\2 end match # Ignore all other directories. match / end match
二、关于Git文件夹是否需要提前创建
完全不需要手动提前创建!svn2git在转换过程中,会自动根据SVN里的文件和目录结构,在Git仓库中生成对应的目录结构。Git本身是基于文件系统快照的版本控制系统,当转换时遇到SVN中的子目录,它会自动在Git仓库中创建对应的文件夹来存放内容,你只需要确保配置规则正确,剩下的目录创建工作交给svn2git就好。
内容的提问来源于stack exchange,提问作者Idris.AH

