排除在git中的.svn文件夹

69

我想排除 subversion 的文件夹不被 git 跟踪。我尝试了几种不同的设置方式在 .git/info/exclude 文件中,但似乎都没有生效。如果我使用 git-svn,需要请求访问权限才能使其工作,所以我宁愿通过排除文件夹来解决问题。

我想要排除 ".svn/entries" 文件夹。

我已经尝试将以下行添加到 .git/info/exlude 文件中: .svn entries .svn/entries entries svn

无论我尝试什么,当我运行 git status 命令时,.svn entries 都会出现。


你说请求访问以使git-svn工作很麻烦?其实git-svn只是发出svn命令,所以如果你已经有了SVN访问权限,你可以使用git-svn而无需任何上游知道或更改任何内容。 - cpjolicoeur
可以在我的工作电脑上安装东西吗?缺少一个 Perl 模块,让管理员去安装实在是太麻烦了... - johannix
7个回答

50

我认为您希望在顶级目录中使用.gitignore文件。如果您将“.svn/entries”放在该文件的一行上,则可以正常工作。您也可以仅使用“.svn”而非“.svn/entries”。

编辑:请查看评论。如果这些文件已经被Git跟踪,它们将始终显示在git status中。


2
我也尝试过这个,但是没有成功。问题在于每个文件夹都有自己的.svn/entries文件。 - johannix
4
即使每个文件夹中都有一个,这对我也有效。如果在git中已经跟踪这些条目,那么它们会出现在 svn status 中吗?如果您已经使用了 git add ,则无论如何它们都会显示出来。只需使用 git rm --cached 命令即可解决问题。 - Jesse Rusak
就是这样。我从主干中添加了所有的文件...好发现,杰西! - johannix
4
虽不是世界上最优雅的方法,但我使用以下命令递归删除 .svn 文件夹(根据 @JesseRusak 的建议):for dir in $(find ./ -type d); do git rm --cached -r $dir/.svn; done; - hayesgm
我刚刚使用这个命令删除了所有旧的 .svn 目录:https://dev59.com/7nM_5IYBdhLWcg3wn0vT#1294608 - iwasrobbed
2
ghayes的规则非常危险,如果有人在文件名中嵌入命令,可能会造成安全问题。或者它可能只是因为一个文件名中有空格而失败。我建议使用这个变体代替: find ./ -type d -name .svn -print0 | xargs -0 git rm --cached -r - mc0e

30

25
将“.svn”加入“~/.gitexcludes”文件中,并告诉git:
echo '.svn' > ~/.gitexcludes
git config --global core.excludesfile "/home/USER_NAME/.gitexcludes"

(确保将 USER_NAME 更改为指向您的主目录)


Casey,我真的以为那会起作用...但遗憾的是它没有。这真的很令人沮丧。 - johannix
2
.gitexcludes.gitignore有什么区别? - Ehtesh Choudhury
1
@Shurane 请参考https://dev59.com/Umkw5IYBdhLWcg3wMHum -- excludes不会被版本控制,而ignores会。 - Ben Flynn
工作正常。注意:应该是“~/.gitexcludes”。 - Yauhen Yakimovich

5

以下的结构和.gitignore内容适用于我:

  • \.git
  • \.svn
  • \.gitignore

.gitignore内容

.svn/
.gitignore

7
不要告诉Git忽略.gitignore文件! - Bengt

3

如果你想保留svn目录,可以先运行以下命令:

svn update --set-depth infinity

for dir in $(find ./ -type d -name \*.svn); do git rm --cached  -r $dir; done;

然后在根目录中运行 echo ".svn" >>.gitignore


3

按照Casey的建议操作,但是将文件命名为.gitignore并放在git库的根目录下。

我也喜欢执行attrib +h .gitignore,这样它就不会在我的资源管理器窗口中显示。


2

由于每个版本化的文件夹都有一个 .svn 目录,因此您必须放置:

*/.svn/*


这个不起作用。它会忽略 src/.svncoolStuff/.svn,但不会忽略 src/main/.svn - Tyler
1
对于多个文件夹,"/" 是一个好选择!然后在 .gitignore 中需要两行: "/.svn/*" 和 "/.svn/*"。 - nils petersohn
对于子文件夹的排除,请使用:** / .svn / - Gweltaz Niquel

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