忽略已提交到Git存储库的文件

忽略已提交到Git存储库的文件,git,caching,version-control,gitignore,git-rm,Git,Caching,Version Control,Gitignore,Git Rm,我有一个已经初始化的Git存储库,我在其中添加了一个.gitignore文件。如何刷新文件索引,以便忽略我要忽略的文件?如果文件已在版本控制中,则需要手动删除这些文件。若要取消跟踪已添加/初始化到存储库中的单个文件,即停止跟踪该文件,但不从系统中删除它,请使用:git rm-cached filename 要取消跟踪.gitignore中的每个文件,请执行以下操作: 首先提交所有未完成的代码更改,然后运行以下命令: git rm -r --cached . 这将从indexstaging区域删

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

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

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

要取消跟踪.gitignore中的每个文件,请执行以下操作:

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

git rm -r --cached .
这将从indexstaging区域删除所有更改的文件,然后运行:

git add .
承诺:

git commit -m ".gitignore is now working"
要撤消git rm-cached文件名,请使用git add filename

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

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

也就是说,如果您已经使用git add添加了一个名为test.txt的文件,那么将test.txt添加到.gitignore仍然会导致跟踪对test.txt的更改


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

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

我不太清楚“answer”命令的作用,所以运行了它,这让我非常失望。它递归地从git repo中删除每个文件

我来营救你

我做到了,因为我有我不想覆盖的未提交的本地文件

我遵循了这些步骤

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

在那之后,git会删除所有本应忽略的文件*.swp。

我遇到的另一个问题是我放置了一条内联注释

tmp/*   # ignore my tmp folder (this doesn't work)
这很有效

# ignore my tmp folder
tmp/
删除.gitignore中的尾随空格


另外,请确保.gitignore中没有尾随空格。我问这个问题是因为我在寻找答案,然后我有一种奇怪的感觉,我应该打开编辑器,而不仅仅是猫叫。从末尾删除了一个额外的空格,如果它现在能正常工作:

我发现.gitignore有一个奇怪的问题。一切都准备就绪,似乎都是正确的。my.gitignore被忽略的唯一原因是行的结尾是Mac格式\r。因此,在使用:set ff=unix以vi结尾的正确行保存文件后,一切都很顺利

多亏了你的回答,我才能够写下这篇小文章来改进它。我在我的.gitignore和repo上运行了它,没有任何问题,但如果有人看到任何明显的问题,请发表评论。这应该是git rm-r-cached from.gitignore:


请注意,您将得到很多致命的错误:pathspec与任何文件都不匹配。这仅适用于尚未修改的文件。

如果您试图忽略对存储库中已跟踪的文件的更改,例如,您需要为本地环境更改的dev.properties文件,但您永远不希望签入这些更改,那么您要做的是:

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

在我的服务器上linux server在我的本地dev mac上不正确,只要我不添加星号,目录将被忽略:

www/archives/*


我不知道为什么,但它让我放松了几个小时,所以我想分享…

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


从我这里的回答来看:

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

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

git update-index --assume-unchanged path/to/file
如果您想再次开始跟踪它:

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

如果要停止跟踪文件而不从本地系统中删除该文件,我更喜欢忽略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

谢谢

正如dav_i所说,为了保持文件处于repo状态,并且在不创建额外提交的情况下将其从更改中删除,您可以使用:

git update-index --assume-unchanged filename

没有一个答案对我有用。

相反:

将文件移出git控制的目录 检查git中的删除 将文件移回git控制的目录 将文件移回后,git将忽略它。
也适用于目录

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

# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*
但这是行不通的:

foo*   # ignore all foo.txt, foo.markdown, foo.dat, etc.
.gitignore解释后一个ca
se作为名为foo*ignore all foo.txt、foo.markdown、foo.dat等的ignore文件,当然您没有这些文件。

如果您需要停止跟踪大量被忽略的文件,可以组合一些命令:

git ls文件-i-排除标准| xargs-L1 git rm-缓存

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


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

到处都是复杂的答案

只需使用以下命令

git rm -r --cached .
它将删除您试图忽略的源文件,而不是您计算机上的主文件


在那之后,只需承诺和推动

请注意在提交之前提交所有更改,否则将失去对所有更改的控制files@TravisWebb你必须先确定你设置了。gitignore。此外,我倾向于不从索引中删除所有文件,而只是使用fileglob(如*.ogit rm-r-cached)删除需要删除的文件。删除的文件比git中的文件多,请为我忽略::。它删除了我甚至没有列出创建答案的目录中的文件,但git rm-cached filename似乎没有那么激烈,因为你没有抓住要点。如果您有一个带有复杂.gitignore的大型项目,例如VisualStudio中的C项目,那么计算要删除的每个文件是非常繁琐的。这三个简单的命令毫无痛苦地修复了一切。这是删除我添加、提交但后来意识到不需要跟踪的两个文件的完美方法。在将这些文件添加到.gitignore后,我可以完成这项工作并完全取消对它们的跟踪。提示:例如,如果将*.config添加到.gitignore中,则可以执行git rm-cached*.config以停止跟踪所有*.config文件。另外请注意,这样做将删除您推送到的其他repo中的文件,即使它保留在您的系统中。如果您只是忽略对文件的更改,不想从其他用户的repo中删除它们,请尝试使用git update index-假设file.nameIMO未更改,这是正确的答案。Wiki answer有点作用,但是非常严厉,特别是在这个问题上。我想修复维基,但我不知道如何修复。很快@奥利:使用这种溶液时要格外小心。这将删除回购协议中的文件,任何进行此更改的人也将删除该文件。最好的解决方案是像@dav_我说的那样,假设不变,或者跳过worktree作为替代。我尝试了git rm-cached和git reset HEAD这两种工具,这两种工具我都很熟悉,只是可以从回购中获得。成功来自第一个rm-cached,然后实际手动删除它,提交删除,然后手动重新创建它。这对我来说是这样的:rm foo/bar&&git add-u&&git commit-m removed foo/bar&&git push。然后运行touch-foo/bar&&git-status将显示文件现在被正确忽略。git-rm-r-cached。不适合我。Git仍然声称没有跟踪my textmate项目文件,即使.tmproj在我的全局忽略文件中。不过,像这样重新设置本地复制程序还是有效的。实际上,我在git reset-hard HEAD中添加了“hard”选项。在这种情况下,这应该具有几乎相同的效果。小心-hard标志。它将在没有警告的情况下抛出任何未提交的更改!我也有同样的问题,我也因为这个问题而问这个问题。幸好你在这里有记录+1如果你喜欢我,你可以使用vi来快速编辑。gitignore使用“:set list”来显示空白。我在执行echo node_modules>>时遇到了这种情况。gitignore至少在Windows上运行了几个星期,我一直对此感到沮丧,直到看到你的空白帖子。谢谢,修复了我的问题。如果有人在windows记事本中创建文件后对.gitignore有问题,这里有更多信息:.gitignore格式是每行都是以a开头的注释,或者包括任何空格的整行都是完整文件名模式。如果您已经\r混合到行中,git将只忽略以\r结尾的文件,您可以根据需要创建这些文件!。有关详细信息,请参阅man gitignore,它值得一读。这并不完全正确,可以忽略跟踪文件中的更改。。。请看我的答案:git更新索引-假设未更改,git rm-caheced实际上不适合我。我已经完成了git-rm,然后创建了一个新的文件,这个文件被成功地忽略了。我使用的是git版本1.8.1-如果这是问题的话。您的语法在这里是错误的。这是git rm test.txt,这里有一个指向更全面答案的链接。如果你的.gitignore对某些特定文件不起作用,这是正确的答案。接受的答案将导致提交您的所有文件。这是天才!非常有用。你知道有没有办法得到所有“保留”文件的列表吗?这对你很有用:git ls files-v如果打印的字符是小写,则文件被标记为假定未更改。见:和:她
e是被忽略别名的更详细版本,它出现在我的~/.gitconfig文件中:ignored=!git ls文件-v$git rev parse-show toplevel | grep'^[:lower:]“| | echo”None-ignored.&&echo'\n使用:git-update-index-假定未更改\n或使用:git-update-index-假定未更改\n再次跟踪它的顶层部分确保它搜索整个存储库。不幸的是-假定未更改不适用于git-stash:更改在git-stash期间被还原,而不是在git隐藏期间重新应用pop。请参阅。不确定mac上的语法是否不同,但我必须稍微修改别名git config-global alias.hidden'!git ls files-v | grep^[:lower:][]Undo:git update index-不假设文件名未更改如果要一次性对文件夹中的所有文件执行此操作怎么办?sed s//$//应该是s//?还有,sed和grep命令的意义是什么?我猜这是从gitignore中过滤出来的评论?小心这一点,因为它假设您要添加除被忽略的文件之外的所有文件,通常情况下,这不是案例+1唯一明智的解决方案似乎是:这应该是公认的答案。gitrm-r-cached。删除了很多其他东西!
git update-index --assume-unchanged filename
# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*
foo*   # ignore all foo.txt, foo.markdown, foo.dat, etc.
git rm -r --cached .