将.gitignore应用于已提交的文件


436

我已经提交了许多文件,现在我想忽略它们。我怎样才能告诉git现在忽略以后提交的这些文件?

编辑:我也想从存储库中删除它们。它们是在构建后或为用户特定的工具支持后创建的文件。



8
@Wooble答案可能相似,但是这个问题恰好描述了我所面临且需要解决的问题。
rjmunro

1
这是对标题问题的回答,而对您的git repo进行了最小的更改即可:stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Answers:


471

12
虽然有很多文件。我不想每个人都这样做
user880954 2011年

1
这些文件是否在任何公共目录中?如果不是这样,那么问题就归结为shell使用问题,而不是git问题。
Matt Ball

12
确实需要有一个“我忘记添加我的.gitignore,直到我首次提交之后”模式。
路加·普普利特

9
答案就在此之下。
2015年

3
它要求我添加标志-r以便能够这样做。
Vishal Gulati '18

599

编辑.gitignore以匹配忽略的文件后,您可以git ls-files -ci --exclude-standard查看排除列表中包含的文件。然后你可以做

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

从存储库中删除它们(不从磁盘删除它们)。

编辑:您也可以将此名称添加为.gitconfig文件中的别名,以便您可以随时运行它。只需在[alias]部分下添加以下行(根据Windows或Mac的需要进行修改):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

-rin中的标志xargs可以防止git rm在空结果上运行并打印出其使用情况消息,但只能由GNU findutils支持。其他版本的xargsmay或可能没有类似的选择。)

现在,您只需输入git apply-gitignore您的存储库,它将为您完成工作!


10
我认为适用于Mac的xargs没有-r ...或者我的越野车/旧车了,我不知道...以及为什么使用!git之前的版本?好吧...我的一个工作过alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"。!
菲利佩·萨比诺

18
在Windows上for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett 2013年

这只是删除了我的.gitignore文件,而不是我想忽略的.gitignore文件中列出的文件-就是这样吗?
Hippyjim 2014年

@Hippyjim如果文件已经提交(即使他们的.gitignore中列出),是的.gitignore 没有尚未提交,那么这将是预期的结果,否则,我不知道什么是你的情况要去。
乔纳森·卡伦

1
对于mac用户,它-r是默认设置,BSD版本不接受。因此删除-r
曾伟石

136

将文件保留在存储库中,但忽略以后的更改:

git update-index --assume-unchanged <file>

并撤消此操作:

git update-index --no-assume-unchanged <file>

找出以这种方式设置了哪些文件:

git ls-files -v|grep '^h'

信贷原始答案 http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/


1
Chronial对于目录递归执行有一个很好的答案: stackoverflow.com/a/16346756/1101076
jordan314 '16

我想提交一个IDE配置,但不跟踪对其进行不必要的更改。尽管我不确定它是否对签出存储库的其他人有用,但它可以工作。可以结合使用,git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchanged如果有帮助。
dlamblin

7
这是恰好满足标题问题要求的唯一答案。完善!这些其他答案大多数都不必要地弄乱了文件。
kayleeFrye_onDeck

1
这是该问题的正确答案。使用如下命令git rm --cached将删除存储库中的文件,这不符合测验者的需要。谢谢。我真的很感激。您的回答对我有很大帮助。
ramwin

88

确保您的实际回购是最新版本

  1. .gitignore根据需要编辑
  2. git rm -r --cached .
  3. git add .

然后照常提交


14
这应该是一个可以接受的答案,因为该问题专门指出要删除许多文件。
nbeuchat

3
请注意,如果您的存储库很大,则第2步可能需要一段时间。
脑袋

这只是导致从索引中删除所有文件!这为我节省了:(git reset HEAD请记住保存任何更改)
aksh1618 '18

2
第2步删除了所有内容,是的,但是第3步应该将它们全部读取,但由于.gitignore而失败的内容除外。
ojchase

11

这是个老问题,但我们当中有些人在git-posh(powershell)中。这是解决方案:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.