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

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

847166 次浏览

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

要取消跟踪已经添加/初始化到存储库的单一文件,请停止跟踪该文件,但不要从系统中删除它: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 .之前提交所有重要的更改否则,您将丢失对其他文件的任何更改。

请小心,当您将其推送到存储库并从其他地方拉取到仍然跟踪这些文件的状态时,这些文件将被删除

.gitignore系统只忽略当前不在git版本控制下的文件。

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

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

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

由于不太清楚“答案”命令的作用,我运行了它,令我非常沮丧。它递归地从您的git存储库中删除每个文件。

堆栈溢出救援…如何恢复“git rm-r”?

git reset HEAD

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

我跟着这些步骤

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

之后,git删除所有应该忽略的文件(在我的情况下是*. swp)。

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

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

这工作

# ignore my tmp foldertmp/

删除. gitignore中的尾随空格

另外,请确保您的. gitignore中没有尾随空格。我遇到这个问题是因为我正在寻找答案,然后我有一种有趣的感觉,我应该打开编辑器而不是只cat'ing. gitignore。从末尾删除了一个额外的空格,啪的一声它现在可以工作了:)

我发现. gitignore有一个奇怪的问题。一切都到位并且看起来正确。我的. gitignore被“忽略”的唯一原因是,行尾是Mac格式(\r)。所以在使用正确的行尾保存文件后(在vi中使用:set ff=unix),一切都工作得很好!

多亏了你的回答,我能够编写这个小单行代码来改进它。我在我的. 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 '<pathspec>' did not match any files。这仅适用于未修改的文件。

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

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

如果你想重新开始追踪变化

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

git-update-index(1)手册页

如果您需要在git重置后持久化,请查看update-index的skip-worktreeno-skip-worktree选项(via


更新:由于人们一直在问,这里有一个方便的(并在下面评论后更新)别名,用于查看本地工作区中当前“忽略”(--sease-不变)的文件

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

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

www/档案/*

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

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

我的答案是:https://stackoverflow.com/a/11451916/406592

对于像我这样的慢性子来说,还有另一个建议=)将. 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

没有一个答案对我有用。

而是:

  1. 将文件移出git控制的目录
  2. 检查删除到git
  3. 将文件移回git控制的目录

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

也可以用目录!

如果.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."的文件,当然,您没有。

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

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 .

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

之后,只是承诺和推动!