关于缓存:忽略已提交到Git存储库的文件

Ignore files that have already been committed to a Git repository

本问题已经有最佳答案,请猛点这里访问。

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


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

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

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

1
git rm -r --cached .

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

1
git add .

承诺:

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.


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

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

如果你想再开始跟踪变化

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

参见Git更新索引(1)手册页。

另外,如果您需要更新索引的skip-worktreeno-skip-worktree选项来保持Git重置(via)之后的状态,请查看更新索引的skip-worktreeno-skip-worktree选项。

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

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


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


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

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

你必须先完成1(10)项工作,然后做出改变。只有这样,对test.txt的更改才会被忽略。


删除.gitignore中的尾随空格

另外,确保.gitignore中没有尾随空格。我之所以问这个问题,是因为我在寻找答案,然后我有一种有趣的感觉,我应该打开编辑而不是仅仅是cat'ing.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

谢谢


到处都是复杂的答案!

只需使用以下内容

1
git rm -r --cached .

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报告中删除每个文件。

StackOverflow去营救…如何还原"git rm-r."?

1
git reset HEAD

做了这个技巧,因为我没有提交不想覆盖的本地文件。


还有另一个建议,对于像me=)这样的慢的人来说,把.gitignore文件放到你的存储库根目录中,而不是.git文件夹中。干杯!


所有的答案对我都不起作用。

而是:

  • 将文件移出Git控制的目录
  • 检查移除到Git中
  • 将文件移回Git控制的目录
  • 将文件移回后,Git将忽略它。也可以使用目录!


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


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

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

    这作品

    1
    2
    # ignore my tmp folder
    tmp/

    多亏你的回答,我才写了这篇小文章来改进它。我在我的.gitignore和repo上运行它,没有问题,但是如果有人看到任何明显的问题,请评论。这应该是来自.gitignoregit 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。这只适用于尚未修改的文件。


    我发现了一个奇怪的问题。一切都安排妥当,似乎都是正确的。我的.gitignore被"忽略"的唯一原因是,行尾为mac格式(
    )。所以,在用正确的行尾保存了文件之后(在vi中使用:set ff=unix),所有的工作都很有魅力!


    这里没有提到的另一个问题是,如果您在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