我有一个已经初始化的Git存储库,我在其中添加了一个.gitignore文件。如何刷新文件索引,以便忽略要忽略的文件?
要取消跟踪已添加/初始化到存储库的单个文件,即停止跟踪该文件,但不从系统中删除该文件,请使用:git rm --cached filename。
要取消跟踪现在在您的.gitignore中的每个文件:
首先提交任何未完成的代码更改,然后运行以下命令:
这将从索引(临时区域)中删除所有更改的文件,然后只运行:
承诺:
1
| git commit -m".gitignore is now working" |
要撤消git rm --cached filename,请使用git add filename。
Make sure to commit all your important changes before running git add .
Otherwise, you will lose any changes to other files.
- 注意之前提交所有更改,否则将失去对所有更改文件的控制。
- 这似乎不是一个推动或干净的克隆。有什么想法吗?
- @Traviswebb你必须先确定你设置了.gitignore。另外,我倾向于不从索引中删除所有文件,只删除那些我需要使用诸如*.o之类的文件球来删除的文件。
- 这是否会中断我要跟踪的文件的任何连续性?
- @博姆豪尔,没有,只是检查了一下。
- 我做了这个,它说我有100个文件后来改变。我做了一个还原,现在,终于,我的.gitignore工作正常,忽略了我的*.user文件。谢谢!
- git rm-r——缓存。删除的文件比Git中的多:(:(。它删除了我甚至没有列出的目录中的文件
- git rm-r——cached实际上从索引中删除了所有内容吗?根据定义,索引只是临时区域,即提交文件之前的位置。或者"索引"有两种定义?(顺便说一句,我很成功)
- 天哪,我担心这会删除我以前所有的提交BC,因为某种原因,我以前的提交在xcode x_x中出现花了一些时间。谢天谢地,它们还在那里!
- 这对我不起作用。Xcode4.5仍然跟踪用户界面状态文件。GRRR怎么办?
- 这是正确的转到解决方案。git忽略以前跟踪的文件。像…如果您通过跟踪所有内容(git add.)开始一个项目,然后发现您希望.gitignore application/config/database.php(不执行@trobrock在上面的答案中所说的操作,git将继续跟踪application/config/database.php文件的内容)。
- 对我来说也不管用。我的有子文件夹。
- 对于未来的读者,您可能需要这些关于答案上使用的命令的引用。kernel.org/pub/software/scm/git/docs/git-rm.html kernel.org/pub/software/scm/git/docs/git-add.html文件
- 我需要在三个命令之后进行一次推送,以使其正常工作。我正在http://tfs.VisualStudio.com/上使用git。我也做了一次同步,但是这个推就足够了。
- 回答很好,但是git rm --cached filename似乎不那么激烈。
- @吉米莫里森,你错过了重点。如果您有一个带有复杂的.gitignore的大型项目(例如Visual Studio中的C项目),则计算出要删除的每个单独文件是很繁琐的。这三个简单的命令可以毫不费力地解决所有问题。
- 这是一个古老的问题,有些人说这对他们来说不起作用。我刚刚试用过,可以在git version 1.8.2.1上确认它对我有效。
- 我得到这个错误致命:路径规范""不匹配任何文件
- 如果您不确定是否运行git rm --cached filename,可以使用git rm --cached --dry-run filename来查看它将要做什么。还记得目录的-r。
- 对于一个不那么残忍的强制方法,我使用:git rm -r --cached some-directory,这将删除所有被gitignored的文件。在这之后,类似这样的称呼:git commit -m 'Remove the now ignored directory"some-directory"'git push origin master。
- 嗨@takeshin,git push在哪里适合这个流程?
- 不是很有帮助的答案。我确实删除了所有未跟踪的文件,但一旦将其设置为"忽略",它就会将文件的删除提交给实时存储库。我会说这个错误的答案。它不应该缓存git rm-r。首先。它在人们不愿意的时候将它们全部删除。
- @ ArvindK。你做了一个Git添加。拆卸后?这个答案删除了所有文件,然后为我重新添加了完全不被忽略的文件(稍微复杂一点.gitignore),不应该有任何自动提交到实时回购…
- 注意,当使用"gitftp"时,它会很高兴地从ftp服务器中删除您的文件!!!!
- 如广告所示):但是,没有对git repo的更新?所有那些"旧"文件仍在那里签入…有办法更新吗?
- @Takeshin这在我的本地repo上起作用,但是当我推到远程(我的登台环境)时,它从登台中完全删除了文件。有没有一种方法可以让它忽略远程文件。
- 一看到所有"rm"文件就害怕!:)然后"保持冷静",继续读下去。这似乎奏效了。
- 非常适合我删除一组目录,其中有多个子文件夹,其中包含我不希望存储在GitHub上的图像。
- 以后一定要用git push,否则不行。
- 当其他已经有了新的gitignore的项目成员提取这个新的提交时,会发生什么?这些文件是从他们的计算机中删除的,还是保留为"原样",因为GitIgnore确保Git拉取不会影响这些文件?
- 不要错过前两个命令末尾的小圆点!(胡说八道)
- 如果在执行上述命令之前忘记提交更改,并且丢失了所有更改的文件,请使用git reset HEAD~1撤消上一次提交(恢复丢失的文件)。如果只运行git rm -r --cached .,则使用git reset HEAD .
- 我失去了所有子模块的踪迹。没有看到这里提到的。
- 我尝试过这个过程,只有在步骤1之后直接提交,它才会起作用。否则,如果我从被忽略的目录中删除文件,更改仍会出现在git….答案末尾的编辑就是这么说的吗?
- 如果这个分支被拉入master,它还能工作吗?
- 我不得不添加"f"来强制删除:git rm -rf --cached .。
如果您试图忽略对存储库中已跟踪的文件(例如,您需要为本地环境更改的dev.properties文件,但不希望签入这些更改)的更改,您要做的是:
1
| git update-index --assume-unchanged <file> |
如果你想再开始跟踪变化
1
| git update-index --no-assume-unchanged <file> |
参见Git更新索引(1)手册页。
另外,如果您需要更新索引的skip-worktree和no-skip-worktree选项来保持Git重置(via)之后的状态,请查看更新索引的skip-worktree和no-skip-worktree选项。
更新:由于人们一直在问,这里有一个方便的别名(并在下面评论后更新),用于查看在本地工作区中当前哪些文件被"忽略"(--假定不变)。
1
| $ git config --global alias.ignored = !git ls-files -v | grep"^[[:lower:]]" |
- 这是天才!非常有用。你知道有没有办法得到所有"保留"文件的列表?
- 这对您很有用:git ls-files -v如果打印的字符是小写,则文件被标记为假定不变。请参见:stackoverflow.com/a/2363495/677381和:git-scm.com/docs/git-ls-files
- 只要你的某个遥控器没有与你现有的文件冲突的更改,这就可以工作。
- 如果您需要集成一个更改,从本地以外的更改到您假定为未更改的文件,您可以始终假定已更改、隐藏、拉/合并、隐藏弹出并再次假定未更改….例如,添加一个每个本地人都希望以这种方式检索的属性并不少见……但这确实适用于最有可能发生冲突的文件…例如,用户名或本地路径…这才是关键所在。
- @这只会影响到我自己吗?还是所有用户?
- @wisbucky这只影响本地签出的文件,不影响回购的来源或任何其他签出副本。
- 这是我的ignored别名的更详细的版本,它出现在我的~/.gitconfig文件中:ignored = !git ls-files -v $(git rev-parse --show-toplevel) | (grep '^[[:lower:]]' || echo 'None ignored.') && echo '
Ignore changes with: git update-index --assume-unchanged
or track again with: git update-index --no-assume-unchanged ',它的顶层部分确保它搜索整个存储库。
- 这对修改过的文件很有效,但我不能让它对我在本地计算机上删除但不希望从repo中删除的文件起作用。知道如何获取本地删除的文件以停止在提交窗口中显示吗?
- 不幸的是,--assume-unchanged不适用于git stash:这些变化在git stash期间恢复,在git stash pop期间不重新应用。看看这个问题。
- 这是一个很好的方法来查看您使用assume-unchanged隐藏的文件,因此我认为您应该称别名为"hidden"而不是忽略它。对我来说,忽略的文件是Git看不到的,因为它们与.GitIgnore中的模式匹配。你可以通过git status -s --ignored | grep '^!!'找到这些文件。
- 我要补充的是,如果文件是分段的,这个命令就不能在文件上工作。如果它以某种方式先进入阶段状态,请确保将其拆下。我的意思是这个命令仍然可以使用,但它将保留在您的列表中,不会被丢弃。所以,只要确保你的身体不变形就行了。
- @斯科特维登也许是一个很好的选择。
- 不确定Mac上的语法是否不同,但我必须稍微修改别名git config --global alias.hidden '!git ls-files -v | grep"^[[:lower:]]"'。
- 你化名中的感叹号和大多数贝壳都混在一起了。也许您应该引用它,或者添加不带任何别名的简单命令:git ls-files -v | grep '^[[:lower:]]'。
要取消对已添加/初始化到存储库的文件的跟踪,即停止跟踪该文件,但不将其从系统使用中删除:git rm --cached filename。
- 这是删除我添加、提交的两个文件的完美方法,但后来发现不需要跟踪。在将这些文件添加到.gitignore之后,我就能够做到这一点,并完美地解压它们。
- 提示:例如,如果将*.config添加到.gitignore中,可以执行git rm --cached *.config以停止跟踪所有*.config文件。
- 另外请注意,这样做将删除您推送到的其他Repo中的文件,即使它保留在您的系统中。如果您只是忽略了对文件的更改,不想从其他用户的repos中删除这些更改,请尝试使用git update-index --assume-unchanged file.name。
- 在我看来,这是正确的答案。wiki答案有点管用,但有点笨手笨脚,特别是考虑到这个问题。(我会修维基,但我不知道怎么修。"很快!";)
- @奥利对这个"解决方案"非常小心。这将删除repo中的文件,任何进行此更改的人也将删除该文件。如@dav ou i所说,最好的解决方案是assume-unchanged,或者--skip-worktree作为替代方案。
是-.gitignore系统只忽略当前不受git版本控制的文件。
也就是说,如果您已经使用git-add添加了一个名为test.txt的文件,那么将test.txt添加到.gitignore中仍然会导致对test.txt的更改被跟踪。
你必须先完成1(10)项工作,然后做出改变。只有这样,对test.txt的更改才会被忽略。
- 这并非完全正确,可以忽略跟踪文件中的更改…请看我的答案:stackoverflow.com/a/11366713/677381
- git update index——假设未更改的和git rm——cahecked实际上对我不起作用。我已经完成了git rm操作,然后在成功忽略之后创建了新文件。我使用的是git版本1.8.1——如果是这个问题的话。
- 这里的语法错误。它是git rm test.txt,这里有一个更全面的答案链接stackoverflow.com/questions/12661306/&hellip;
删除.gitignore中的尾随空格
另外,确保.gitignore中没有尾随空格。我之所以问这个问题,是因为我在寻找答案,然后我有一种有趣的感觉,我应该打开编辑而不是仅仅是cat'ing.gitignore。从末尾删除了一个额外的空间,如果它现在工作了,就将其释放出来:)
- 我有一个完全相同的问题,:p.我也因为这个问题得到了这个问题。幸好你把这个记录在这里了。+ 1
- 如果喜欢我,你可以使用vi快速编辑.gitignore使用":set list"来显示空白。
- 当我做一个echo node_modules >> .gitignore的时候(至少在窗户上),我就意识到了这一点。
- 几个星期来,我一直对这个感到沮丧,直到看到你的空白帖子。谢谢,解决了我的问题。
我遵循这些步骤
1 2 3
| git rm -r --cached .
git add .
git reset HEAD |
之后,git删除所有应该忽略的文件(在我的例子中是swp)。
- 注意这一点,因为它假定您要添加除被忽略的文件以外的所有文件,通常情况并非如此。
如果您想停止跟踪文件而不从本地系统删除该文件,我宁愿忽略config/database.yml文件。简单地尝试一下:
1 2
| git rm --cached config/database.yml
# this will delete your file from git history but not from your local system. |
现在,将这个文件添加到.gitignore文件并提交更改。从现在起,对config/database.yml所做的任何更改都不会被git跟踪。
1
| $ echo config/database.yml >> .gitignore |
谢谢
到处都是复杂的答案!
只需使用以下内容
It will remove the files you are trying to ignore from the origin and not from the master on your computer!
在那之后,只需承诺和推动!
要从跟踪中删除几个特定文件:
1
| git update-index --assume-unchanged path/to/file |
如果您想再次跟踪它:
1
| git update-index --no-assume-unchanged path/to/file |
正如Dav_i所说,为了在repo中保留文件,同时在不创建额外提交的情况下将其从更改中删除,您可以使用:
1
| git update-index --assume-unchanged filename |
- 撤销:git update-index --no-assume-unchanged filename。
- 如果你想一次性处理文件夹中的所有文件怎么办?
我不太清楚"回答"命令是怎么做的,我很沮丧地执行了它。它递归地从Git报告中删除每个文件。
StackOverflow去营救…如何还原"git rm-r."?
做了这个技巧,因为我没有提交不想覆盖的本地文件。
- 埃多克斯一号〔0〕对我不起作用。Git仍然声称没有跟踪我的textmate项目文件,即使.tmproj在我的全局忽略文件中。不过,像这样重置我的本地repro是有效的。实际上,我添加了"硬"选项,如git reset --hard HEAD所示。在这种情况下,效果应该差不多。
- 当心--hard旗。它将在不发出警告的情况下抛出任何未提交的更改!
还有另一个建议,对于像me=)这样的慢的人来说,把.gitignore文件放到你的存储库根目录中,而不是.git文件夹中。干杯!
所有的答案对我都不起作用。
而是:
将文件移出Git控制的目录
检查移除到Git中
将文件移回Git控制的目录
将文件移回后,Git将忽略它。也可以使用目录!
如果文件已经在版本控制中,则需要手动删除它们。
- 我试过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将显示文件现在已被正确忽略。
另一个问题是我放置了一个内联注释。
1
| tmp/* # ignore my tmp folder (this doesn't work) |
这作品
1 2
| # ignore my tmp folder
tmp/ |
多亏你的回答,我才写了这篇小文章来改进它。我在我的.gitignore和repo上运行它,没有问题,但是如果有人看到任何明显的问题,请评论。这应该是来自.gitignore的git rm -r --cached:
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 '' did not match any files。这只适用于尚未修改的文件。
- sed-s//$//是否应该是s/$//?另外,sed和grep命令的意义是什么?我猜这是从gitignore过滤的评论?
我发现了一个奇怪的问题。一切都安排妥当,似乎都是正确的。我的.gitignore被"忽略"的唯一原因是,行尾为mac格式(
)。所以,在用正确的行尾保存了文件之后(在vi中使用:set ff=unix),所有的工作都很有魅力!
- 如果在Windows记事本中创建文件后有任何人对.gitignore有问题,请参阅以下详细信息:stackoverflow.com/questions/11451535/gitignore not working/&hellip;
- .gitignore格式是每行要么是注释(以#开头),要么整行(包括任何空格)是完整的文件名模式。如果您将
混合到行中,git将只忽略以
结尾的文件(如果需要,可以创建这些文件!).详情见man gitignore,值得一读。
这里没有提到的另一个问题是,如果您在Windows记事本中创建了.gitignore,我发现它在其他平台上可能看起来像胡言乱语。关键是要确保在记事本中将编码设置为ansi(或像我一样在Linux上创建文件)。
我的答案是:https://stackoverflow.com/a/11451916/406592
在我的服务器Linux服务器上(在我的本地dev mac上不是这样),只要不添加星号,目录就会被忽略:
www/archives/*
我不知道为什么,但它让我放松了几个小时,所以我想分享…
如果.gitignore似乎没有忽略未跟踪的文件,还需要记住的一点是,您不应该在忽略文件的同一行上有注释。所以这没问题
1 2
| # ignore all foo.txt, foo.markdown, foo.dat, etc.
foo* |
但这不起作用:
1
| foo* # ignore all foo.txt, foo.markdown, foo.dat, etc. |
.gitignore将后一种情况解释为"忽略名为"foo* # ignore all foo.txt, foo.markdown, foo.dat, etc."的文件,当然,您没有。
如果需要停止跟踪许多被忽略的文件,可以组合以下命令:
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 .删除了很多其他东西!