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

时间:2010-07-15 18:24:19

标签: git

我开始使用带有xcode项目的git,并且最近发现我可以使用.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

谢谢!

6 个答案:

答案 0 :(得分:63)

这是一种“解锁”任何在当前排除模式下将被忽略的文件的方法:

(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-files 提供一个不存在的索引文件,以便它认为没有跟踪文件。上面的shell代码询问索引为空时将被忽略的所有文件,然后使用 git rm 将它们从实际索引中删除。

文件“未跟踪”后,使用 git status 验证是否删除了重要信息(如果是,请调整排除模式并使用git reset -- path恢复已删除的索引条目) 。然后创建一个新的提交,省略“crud”。

“crud”仍将在任何旧提交中。如果你确实需要一个干净的历史记录(nb使用 git filter-branch 将“重写历史记录”,你可以使用git filter-branch生成旧提交的干净版本,所以不应该轻易进行如果你有任何合作者在“crud”首次介绍之后撤消了你的任何历史提交。

答案 1 :(得分:37)

使用git rm --cached表示文件,git rm -r --cached表示build/目录

答案 2 :(得分:10)

如果您已经在跟踪要忽略的文件,则必须使用

删除它们
git rm --cached <file>

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

答案 3 :(得分:1)

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'

这是一个手动工作流程,但它是我过去如何做到的。

答案 4 :(得分:1)

如果您想完全删除文件,那么这里是handy reference from Github

警告:

  1. 这将重写您的历史记录,因此在发布您的回购邮件之前,这可能是值得做的。
  2. 请记住,旧的shas仍然在对象数据库中,但我链接到的指南将向您展示如何处理这些。

答案 5 :(得分:-1)

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

编辑:我发现您可能遇到此问题,因为您已添加了您不想跟踪的文件。以下是gitignore手册页有关的内容:

  

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