我有一个已经初始化的Git存储库,在其中添加了.gitignore文件。如何刷新文件索引,以便忽略要忽略的文件?

#1 楼

要取消跟踪已添加/初始化到存储库中的单个文件,即停止跟踪文件但不从系统中删除它,请使用:git rm --cached filename

要取消跟踪.gitignore中的每个文件:

首先提交任何未完成的代码更改,然后运行以下命令:

git rm -r --cached .


这将从索引中删除所有更改的文件(暂存)区域),然后只需运行:

git add .


提交:

git commit -m ".gitignore is now working"



要撤消git rm --cached filename,请使用git add filename


确保在运行git add .之前提交所有重要更改
否则,您将丢失对其他文件的任何更改。


评论


请事先确认所有更改,否则您将失去对所有更改文件的控制

–黄佩
2010年1月13日在14:48

@TravisWebb您必须确保首先设置.gitignore。另外,我倾向于不从索引中删除所有文件,而仅使用* .o这样的Fileglobs删除我需要的文件。

–Jason S
2011-12-27 20:41

git rm -r --cached。删除了比git中更多的文件:( :(。它删除了我什至没有列出的目录中的文件

–迪恩·希勒(Dean Hiller)
2012年8月14日在20:07

很好的答案,但git rm --cached文件名似乎少了一点点恕我直言。

–吉姆·莫里森(Jim Morrison)
13-10-21在20:37



@JimMorrison,您错过了重点。如果您有一个带有复杂的.gitignore的大型项目(例如Visual Studio中的C#项目),弄清楚要删除的每个文件就很麻烦。这三个简单的命令可以轻松修复所有问题。

–长长的脖子
13年13月13日在13:52

#2 楼

如果您试图忽略对存储库中已经跟踪的文件的更改(例如,您需要针对本地环境进行更改的dev.properties文件,但您永远不想签入这些更改),则超出了您想要做的事情是:

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


如果您想再次开始跟踪更改

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


请参见git-update-index( 1)手册页。

如果需要通过git-reset(通过git-reset)来保持更新,还可以查看skip-worktreeno-skip-worktree的update-index选项。


Update:
由于人们一直在问,这是一个方便的别名(自下面进行评论后进行了更新),用于查看本地工作空间中当前被“忽略”(-假定不变)的文件

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"


评论


这是天才!非常有用。您知道是否有办法获取所有“保留”文件的列表吗?

– artfulrobot
13年2月5日于13:06

这将为您工作:git ls-files -v如果打印的字符是小写字母,则该文件被标记为假定不变。请参阅:stackoverflow.com/a/2363495/677381和:git-scm.com/docs/git-ls-files

–dyodji
13年2月6日在1:33



这是我的〜/ .gitconfig文件中出现的别名的详细程度,比我更详细:忽略=!git ls文件-v $(git rev-parse --show-toplevel)| (grep'^ [[:: lower:]]'|| echo'None忽略。')&& echo'\ n忽略更改:git update-index --assume-unchanged \ nor再次跟踪:git update- index --no-assume-unchanged '的顶层部分确保它搜索整个存储库。

–克里斯
2015年2月10日在6:22



不幸的是-假设未更改不适用于git stash:更改在git stash期间恢复,并且在git stash pop期间未应用。看到这个问题。

–斯科特·韦尔登
16年4月27日在17:39

不知道Mac上的语法是否不同,但是我不得不稍微修改别名git config --global alias.hidden'!git ls-files -v | grep“ ^ [[:: lower:]]”'

–克里斯蒂安·拉米雷斯(Crhistian Ramirez)
18年3月13日在16:14

#3 楼

要取消跟踪已添加/初始化到存储库中的文件,即停止跟踪文件但不从系统中删除它,请使用:git rm --cached filename

评论


这是删除我添加,提交的两个文件的完美方法,但后来意识到不需要跟踪。将这些文件添加到.gitignore后,我能够执行此操作并完美地取消跟踪它们。

–安德鲁(Andrew Larned)
2011年4月8日在16:17

提示:例如,如果将* .config添加到.gitignore,则可以执行git rm --cached * .config停止跟踪所有* .config文件。

–dav_i
2013年3月6日13:30



还要注意,即使它保留在您的系统上,这样做也会从您推送到的其他存储库中删除文件。如果您只是忽略文件更改,并且不想从其他用户的存储库中删除它们,请尝试使用git update-index --assume-unchanged file.name

–dav_i
13年8月8日在10:15

海事组织,这是正确的答案。 Wiki的答案很不错,但举手之劳,特别是考虑到这个问题。 (我将修复Wiki,但不确定如何。“很快!”;)

–奥利
2014年7月17日在3:20

@Olie对于此“解决方案”要格外小心。这将删除存储库中的文件,任何进行此更改的人也将删除该文件。最好的解决方案是像@dav_i所说的那样保持不变,或者使用--skip-worktree作为替代方案。

– Sebastianb
17年9月12日在20:37

#4 楼

是的-.gitignore系统仅忽略git当前不受版本控制的文件。

即如果您已经使用test.txt添加了一个名为git-add的文件,则将test.txt添加到.gitignore仍然会导致对test.txt的更改进行跟踪。

您必须先git rm test.txt并提交更改。只有这样,对test.txt的更改才会被忽略。

评论


这并非完全正确,可以忽略跟踪文件中的更改...请参阅我的答案:stackoverflow.com/a/11366713/677381

–dyodji
13年1月3日在22:08

git update-index-假定未更改的和git rm --caheced 不适用于我。我已经完成git rm ,然后在成功忽略了该之后创建了新文件。我正在使用git版本1.8.1-如果那是问题所在。

– mujaffars
16-2-24在6:24



您的语法在这里是错误的。它是git rm test.txt,这是指向更全面答案的链接stackoverflow.com/questions/12661306/…

– Linnea Huxford
16 Dec 24 '20:13



如果您的.gitignore不适用于某些特定文件,则这是正确的答案。接受的答案将导致提交所有文件。

–devfaysal
2月9日下午3:39

#5 楼

删除.gitignore中的尾随空格。

此外,请确保.gitignore中没有尾随空格。我之所以提出这个问题,是因为我正在寻找答案,所以我有一种有趣的感觉,我应该打开编辑器,而不仅仅是打开.gitignore。从末尾删除了一个多余的空格,现在可以正常使用了:)

评论


我有完全一样的问题,:P。因此,我也想到了这个问题。好东西,你在这里有记录。 +1

– Hindol
2012年7月11日在5:08

如果像我一样,您可以使用vi快速编辑.gitignore,使用':set list'显示空白。

–山姆·吉尔斯(Sam Giles)
13年3月12日在16:35

当我执行echo node_modules >> .gitignore(至少在Windows上)时,这发生在我身上

–科伊
2014年5月3日20:16

数周以来,我一直对此感到沮丧,直到看到您的空白帖子。谢谢,解决了我的问题。

–烈焰
2015年10月8日在22:01

#6 楼

我按照以下步骤操作

git rm -r --cached .
git add .
git reset HEAD


之后,git删除所有应该忽略的文件(对于我来说是* .swp)。

评论


小心一点,因为它假定您要添加所有文件,但忽略的文件除外,通常情况并非如此

–RoeeK
17年1月19日在22:32

太棒了! +1

– Codetard
19-10-14在20:35

#7 楼

如果要停止跟踪文件而又不从本地系统中删除文件,我更喜欢忽略config/database.yml文件。只需尝试:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.


现在,将此文件添加到.gitignore文件并提交更改。从现在开始,git不会跟踪对config / database.yml所做的任何更改。

$ echo config/database.yml >> .gitignore


感谢

#8 楼

到处都有复杂的答案!

只需使用以下

git rm -r --cached .



它将从源中删除您尝试忽略的文件。而不是计算机上的主机!


之后,只需提交并推送即可!

评论


谢谢兄弟。

–阿萨杜扎曼·索赫尔
5月9日15:15

#9 楼

要从跟踪中删除一些特定文件:

git update-index --assume-unchanged path/to/file


如果要再次开始跟踪它,请:

git update-index --no-assume-unchanged path/to/file                      


#10 楼

正如dav_i所说的,为了将文件保留在回购中并且又将其从更改中删除而不创建额外的提交,您可以使用:

git update-index --assume-unchanged filename


评论


撤消:git update-index-无假定不变的文件名

–化学编程器
15年11月24日在12:01

如果要一次性对一个文件夹中的所有文件执行该操作怎么办?

–bg17aw
16 Dec 2'在12:54

#11 楼

我不知道'answer'命令做了什么,令我非常沮丧。它递归地从git仓库中删除每个文件。

要解决的堆栈溢出问题...如何还原“ git rm -r” ??

git reset HEAD


有了这个窍门,因为我有我不想覆盖的未提交的本地文件。

评论


git rm -r --cached。没有为我工作。即使.tmproj位于我的全局忽略文件中,Git仍声称未跟踪我的textmate项目文件。像这样重置我的本地repro可以。实际上,我在git reset --hard HEAD中添加了“ hard”选项。在这种情况下,应该具有几乎相同的效果。

–IAmNaN
2012年5月16日19:33

注意--hard标志。它将丢弃所有未提交的更改,而不会发出警告!

– Mikko Rantalainen
13年1月1日在13:02

#12 楼

对于像我这样的慢家伙,可能还有另一种建议=)将.gitignore文件放入您的存储库根目录,而不是.git文件夹中。干杯!

#13 楼

没有答案对我有用。


相反:


将文件移出git控制的目录
检查移入git
将文件移回git控制的目录中



将文件移回后,git将忽略它。

也可以使用目录!

评论


似乎唯一的理智的解决方案:)

–Erti-Chris Eelmaa
17年9月8日于20:51

#14 楼

如果文件已经在版本控制中,则需要手动删除它们。

评论


我尝试了git rm --cached和git reset HEAD这两个我相当熟悉的工具,并且可以从仓库中获取它。成功首先来自rm --cached,然后实际上是手动删除它,提交删除,然后手动重新创建。它不见了。

– doublejosh
2012年4月17日在23:17



这对我来说是这样的:rm foo / bar && git add -u && git commit -m“ removed foo / bar” && git push。然后运行touch foo / bar && git status将显示文件已被正确忽略。

– AWrightIV
2014年2月21日在3:03



#15 楼

我遇到的另一个问题是我放置了嵌入式注释。

tmp/*   # ignore my tmp folder (this doesn't work)


此作品

# ignore my tmp folder
tmp/


#16 楼

多亏了您的回答,我才能够写出这个小单行代码来改进它。我在.gitignore和repo上运行了它,没有任何问题,但是如果有人看到任何明显的问题,请发表评论。这应该是来自git rm -r --cached.gitignore

cat $(git rev-parse --show-toplevel)/.gitIgnore | sed "s/\/$//" | grep -v "^#" | xargs -L 1 -I {} find $(git rev-parse --show-toplevel) -name "{}" | xargs -L 1 git rm -r --cached


请注意,您会得到很多fatal: pathspec '<pathspec>' did not match any files。那只是针对未修改的文件。

评论


sed s // $ //应该是s / $ //吗?另外,sed和grep命令的目的是什么?我猜它是从gitignore过滤掉的评论?

–假名
16年8月17日在17:27



#17 楼

我发现.gitignore有一个奇怪的问题。一切都准备就绪,似乎是正确的。我的.gitignore被“忽略”的唯一原因是,行尾使用Mac格式(\ r)。因此,在使用正确的行尾保存文件后(在vi中使用:set ff = unix),一切都像一个符咒一样!

评论


如果在Windows记事本中创建文件后,如果有人对.gitignore有问题,请在此处获取更多信息:stackoverflow.com/questions/11451535/gitignore-not-working/…

–马特·帕金斯(Matt Parkins)
2012年12月4日11:16



.gitignore格式是每行要么是注释(以#开头),要么整行(包括任何空格)都是完整的文件名模式。如果您在行中混入\ r,则git将仅忽略以\ r结尾的文件(您可以根据需要创建这些文件!)。有关详细信息,请参见man gitignore,值得阅读。

– Mikko Rantalainen
13年1月1日在13:05



#18 楼

这里没有提到的另一个问题是,如果您在Windows记事本中创建了.gitignore,那么我发现它在其他平台上看起来像是乱码。关键是确保在记事本中将编码设置为ANSI(或像我一样在linux上创建文件)。

从我的回答这里:https://stackoverflow.com/a / 11451916/406592

#19 楼

在我的服务器linux服务器上(在我的本地dev mac上不是真的),只要我不添加星号,目录就会被忽略:


www / archives / *


我不知道为什么,但是这让我失去了几个小时,所以我想分享...

#20 楼

如果.gitignore似乎没有忽略未跟踪的文件,还要记住的一件事是您不应在忽略的同一行上添加注释。所以没关系

# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*


但这不起作用:

foo*   # ignore all foo.txt, foo.markdown, foo.dat, etc.


.gitignore将后一种情况解释为“忽略名为"foo* # ignore all foo.txt, foo.markdown, foo.dat, etc."的文件,当然,您没有。

#21 楼

如果您需要停止跟踪许多被忽略的文件,可以结合使用以下命令:

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

这将停止跟踪被忽略的文件。如果要从文件系统中实际删除文件,请不要使用--cached选项。您还可以指定一个文件夹来限制搜索,例如:

git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm

评论


这应该是公认的答案。 git rm -r --cached。删除许多其他东西!

– Shital Shah
19年1月2日在18:13