2683

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

4

21 回答 21

4455

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

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

于 2009-07-16T19:32:50.543 回答
662

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

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

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

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

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

如果您需要在 git-reset ( via )之后持续存在,还可以查看 update-index 的skip-worktreeand选项no-skip-worktree


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

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"
于 2012-07-06T17:09:29.007 回答
373

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

于 2010-09-14T23:55:15.740 回答
90

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

即,如果您已经添加了一个名为test.txtusing的文件git-add,那么添加test.txtto仍然会导致跟踪.gitignore更改。test.txt

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

于 2009-07-18T08:15:31.360 回答
54

删除 .gitignore 中的尾随空格

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

于 2012-02-02T15:59:49.453 回答
46

我按照这些步骤

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

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

于 2011-07-15T07:22:58.157 回答
44

到处都是复杂的答案!

只需使用以下

git rm -r --cached .

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

之后只需提交并推送!

于 2017-07-19T05:38:19.067 回答
42

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

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 跟踪。

$ echo config/database.yml >> .gitignore

谢谢

于 2014-03-02T09:00:50.530 回答
31

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

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

如果您想再次开始跟踪它:

git update-index --no-assume-unchanged path/to/file                      
于 2013-08-21T14:20:59.693 回答
29

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

git update-index --assume-unchanged filename
于 2015-04-17T07:21:44.333 回答
25

不知道“回答”命令做了什么,我运行了它,这让我很沮丧。它递归地从您的 git 存储库中删除每个文件。

Stackoverflow 的救援......如何恢复“git rm -r。”?

git reset HEAD

成功了,因为我有不想覆盖的未提交的本地文件。

于 2011-04-12T20:39:32.243 回答
25

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

于 2013-06-18T21:08:56.640 回答
25

没有一个答案对我有用。

反而:

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

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

也适用于目录!

于 2015-11-15T04:03:26.390 回答
23

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

于 2009-07-16T19:28:57.603 回答
21

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

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

这行得通

# ignore my tmp folder
tmp/
于 2011-12-06T13:14:59.130 回答
15

感谢您的回答,我能够编写这个小单行来改进它。我在我的 .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. 这仅适用于尚未修改的文件。

于 2012-07-03T17:25:08.077 回答
10

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

于 2012-03-02T09:56:39.580 回答
10

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

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

于 2013-05-21T09:43:51.703 回答
8

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

www/档案/*

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

于 2013-03-09T06:36:42.540 回答
8

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

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

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

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

于 2017-04-20T06:18:57.577 回答
7

.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.",当然,您没有。

于 2016-02-19T22:52:59.310 回答