4

我正在将一个 svn 存储库转换为一个 git 存储库,并且我们有许多多年来已签入的二进制文件,以及图像和其他文件,我真的不希望这些文件出现在git repo 占用空间。

我已经使用 git-svn 来转换 repo 并使用了它的 -ignorepaths 属性,但我希望能够将列表输入到忽略路径中,而不必为我想要的每个模式/目录指定一个忽略路径排除,如果我可以在转换过程中使用 svnignore/gitignore 文件,这样可以更好地消除这个垃圾。

有没有办法做到这一点,还是我只需要咬紧牙关并单独指定每个模式/路径?

编辑:更新的问题更清楚我在问什么

4

3 回答 3

2

如果你习惯 git,Subversion 会有点复杂。svn:ignore是在每个文件夹的基础上工作的属性。在特定文件夹中,您只能忽略特定文件或直接子文件夹。您可以将文件传递给在 DIRECTORY 上设置忽略属性的命令,也可以将 .gitignore 文件传递​​给它:

svn propset svn:ignore -F .gitignore DIRECTORY

但是由于上述原因,.gitignore 中真正实用的部分*/build将在 Subversion 中无效。

您唯一能做的就是使用--depth参数,svn propset例如,如果您通过--depth immediates,它将设置 DIRECTORY 和每个直接子文件夹的属性。还有一些方法可以指定深度或将其设置为 inifite - 我认为 TAB 完成在那里工作或查看帮助。

但是仍然有一个主要缺点:每次添加包含要忽略的文件的文件夹时,都必须svn propset再次运行该命令。

于 2012-08-24T07:38:47.270 回答
1

我可以确认,从 Subversion 获取时git svn不会注意到任何内容.gitignore无论是否.gitignore已签入 repo。

如您的问题所述,解决方案是--ignore-pathsgit svn clone. 完成此操作后,它将被添加到.git/config文件中,因此您不必在每次获取内容时都指定它。

将现有.gitignore文件转换为 Perl 正则表达式以使用 with--ignore-paths并不像看起来那么复杂,因为您可以术语一起使用。

例如:

/[Dd]ebug/|^rootfile\.txt$|\.bak$

排除debug路径中任意位置的文件夹、rootfile.txtrepo 根目录中的特定文件以及所有*.bak文件。

提示:

  • 以正斜杠结尾的表达式将排除命名文件夹的内容,但不排除文件夹本身
  • ^匹配存储库的根目录,并且根目录的路径不以斜杠开头
  • 如果需要,您可以在正则表达式中使用环视表达式,例如排除所有Bin文件夹,除非它们前面有某个特定目录
于 2017-03-03T11:17:17.077 回答
0

如果您想将 svn:ignore 转换为 .gitignore 或反之亦然,您可以使用SubGit而不是 git-svn,它会自动执行此转换。最简单配置中的转换命令如下所示:

$ subgit install path/to/svn/repository
于 2012-08-24T11:06:29.483 回答