Git SVN 忽略路径使用忽略文件。

4
我正在将一个svn仓库转换为git仓库,多年来我们已经提交了许多不应该提交的二进制文件、图片和其他文件,我不想在git仓库中保留这些占用空间的文件。
我尝试使用git-svn转换仓库,并使用其-ignorepaths属性,但我希望能够将列表提供给忽略路径,而不是必须为每个要排除的模式/目录指定一个ignorepaths。如果我可以在转换过程中使用svnignore/gitignore文件来清除这些垃圾文件,那就更好了。
是否有方法可以做到这一点,还是我必须逐个指定每个模式/路径?

它可能确实如此,但我只是举个例子,我想要有一堆扩展/路径很容易。 - Daniel Powell
我认为这没有简单的解决方法 - 你必须列出你想要忽略的内容 - 可以使用创造性的正则表达式或者直接列出它们。 - Adrian Cornish
3个回答

2

如果您习惯了Git,那么Subversion可能会有点复杂。svn:ignore是一个基于每个文件夹的属性。在特定文件夹中,您只能忽略特定的文件或直接子文件夹。 您可以通过向命令传递文件来设置DIRECTORY上的忽略属性,并且还可以将.gitignore文件传递给该命令:

svn propset svn:ignore -F .gitignore DIRECTORY

但是由于上述原因,在Subversion中像*/build这样的实际有用的.gitignore部分将没有任何效果。
你唯一能做的就是利用--depth参数来进行svn propset操作,例如如果你传入--depth immediates,它将为DIRECTORY和每个直接的子文件夹设置属性。还有其他指定深度或仅使其无限制的方法,我想TAB补全在那里起作用,或者查看帮助。
不过仍然存在一个主要缺点:每次添加包含你想要忽略的文件的文件夹时,都必须再次运行svn propset命令。

不幸的是,我认为这不是我正在寻找的内容,我想要将一个svn仓库转换为git仓库,并且删除一些沿途添加的垃圾,就好像它从未发生过一样。 - Daniel Powell

1
我可以确认,在从Subversion获取内容时,git svn不会注意到.gitignore的内容,无论.gitignore是否已经被检入存储库。

解决方案如您所述,在使用git svn clone时使用--ignore-paths选项。完成后,它将添加到.git/config文件中,因此您无需每次获取内容时都指定它。

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

例如:

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

在路径中排除debug文件夹,根目录中的特定文件rootfile.txt,以及所有*.bak文件。

提示:

  • 以斜杠结尾的表达式将排除命名文件夹的内容但不包括文件夹本身
  • ^匹配仓库的根目录,而从根目录开始的路径不以斜杠开头
  • 如果需要,可以使用正则表达式中的环视表达式,例如排除所有Bin文件夹,除非它们是某个特定目录的前缀

0
如果您想将 svn:ignore 转换为 .gitignore 或反之亦然,可以使用 SubGit 而不是 git-svn,后者可以自动执行此转换。在最简单的配置中,转换命令如下所示:
$ subgit install path/to/svn/repository

这并不是我想要的,我想使用 git-ignore 创建一个 git 存储库,在创建存储库时过滤掉一些文件。 - Daniel Powell
gitignore与此无关,你的问题有点误导。要过滤文件,可以使用“svnadmin dump”+ svndumpfilter / svndumptool +“svnadmin load”或我提供的实用程序——svnkitfilter(您可以将其打补丁以过滤任何您想要的内容)——在SVN端过滤某些内容,“git filter-branch”在Git端过滤或使用--ignore-paths选项的git-svn。 - Dmitry Pavlenko
是的,我正在寻找一种方法,可以为 ignore-path 提供一个选项列表,而不是逐个列出每个选项,或者实现基本相同的功能。 - Daniel Powell
我已经更新了问题,试图澄清我所寻找的内容。 - Daniel Powell

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