将git .gitignore规则应用于现有的存储库

我开始使用git和一个xcode项目,最近发现我可以使用.gitignore和.gitattributes文件来忽略编译器和系统的噪音。 现在我已经有了.gitignore和.gitattributes文件了,我怎样才能“应用”新的忽略规则,并摆脱版本控制的压力?

我的.gitignore文件是:

# xcode noise *.modelv3 *.pbxuser *.perspective *.perspectivev3 *.pyc *~.nib/ build/* # Textmate - if you build your xcode projects with it *.tm_build_errors # old skool .svn # osx noise .DS_Store profile 

而我的.gitattributes文件是:

 *.pbxproj -crlf -diff -merge 

谢谢!

使用git rm --cached作为文件,使用git rm -r --cached作为build/目录

这里有一种方法可以“解开”在当前一组排除模式下被忽略的任何文件:

 (GIT_INDEX_FILE=some-non-existent-file \ git ls-files --exclude-standard --others --directory --ignored -z) | xargs -0 git rm --cached -r --ignore-unmatch -- 

这将文件保留在工作目录中,但将其从索引中删除。

这里使用的技巧是提供一个不存在的索引文件git ls文件,以便它认为没有跟踪的文件。 上面的shell代码要求所有的文件将被忽略,如果索引是空的,然后用git rm从实际的索引中删除它们。

在文件被“untracked”后,使用git状态来validation没有重要的东西被删除(如果是这样调整你的排除模式,并使用git reset -- path来恢复删除的索引条目)。 然后做一个新的承诺,抛弃了“泥沼”。

“crud”将仍然在任何旧的承诺。 如果你真的需要一个干净的历史logging(使用git filter-branch将“重写历史logging”,你可以使用git filter-branch生成旧的提交的干净版本,所以如果你有任何合作者已经拉第一次介绍“crud”之后的任何历史承诺)。

如果您已经在跟踪要忽略的文件,则必须将其删除

 git rm --cached <file> 

Git不会忽略已经被跟踪的文件(即你用git add添加它们)。

mv the_file_i_want_to_ignore the_file_i_want_to_ignore.back

git rm the_file_i_want_to_ignore

mv the_file_i_want_to_ignore.back the_file_i_want_to_ignore

git status

git commit -m 'ignore a bunch of stuff i should have ignored before'

这是一个手动工作stream程,但它是如何做到这一点在过去。

如果你想完全删除文件,那么这里有一个从Github的方便参考 。

被警告:

  1. 这将重写你的历史,所以在你发布你的回购之前,这可能是值得的。
  2. 请记住,旧的shas仍然会在对象数据库中,但是我所链接的指南也会告诉你如何处理这些数据。

您不应该“应用”更改。 只需将.gitignore文件放在你的主目录(如果你希望它是全局的)或者你的项目根目录下(如果你希望它只对那个项目是唯一的)。

编辑:这发生在我身上,你可能有这个问题,因为你已经添加了你不想跟踪的文件。 以下是gitignore手册页的说明:

请注意,所有的gitignore文件确实只涉及到git没有跟踪的文件; 为了忽略已经跟踪的文件中未提交的更改,请参阅git update-index –assume-unchanged文档。