这个问题在这里已经有了答案:如何让 Git 忘记一个被跟踪但现在位于 .gitignore 中的文件? (32 个回答) 4 年前关闭。
我有一个已初始化的 Git 存储库,我添加了一个 .gitignore
文件。如何刷新文件索引以便忽略我想要忽略的文件?
要取消跟踪已添加/初始化到您的存储库的单个文件,ie,请停止跟踪该文件但不要将其从系统中删除,使用: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 之前提交所有重要更改。否则,您将丢失对其他文件的任何更改。
请注意,当您将其推送到存储库并从其他地方拉入仍然跟踪这些文件的状态时,这些文件将被删除
如果您尝试忽略对已在存储库中跟踪的文件的更改(例如,您需要为本地环境更改但您永远不想签入这些更改的 dev.properties 文件)而不是您想要做的是:
git update-index --assume-unchanged <file>
如果您想再次开始跟踪更改
git update-index --no-assume-unchanged <file>
请参阅git-update-index(1) Manual Page。
如果您需要它在 git-reset (via) 之后持续存在,还可以查看 update-index 的 skip-worktree
和 no-skip-worktree
选项
更新:由于人们一直在问,这里有一个方便的(并且在下面评论后更新)别名,用于查看本地工作区中当前“忽略”哪些文件(--assume-unchanged)
$ 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
ignored
别名的稍微详细的版本,它出现在我的 ~/.gitconfig 文件中: ignored = !git ls-files -v $(git rev-parse --show-toplevel) | (grep '^[[:lower:]]' || echo 'None ignored.') && echo '\nIgnore changes with: git update-index --assume-unchanged <file> \nor track again with: git update-index --no-assume-unchanged <file>'
它的顶层部分确保它搜索整个存储库。
--assume-unchanged
不适用于 git stash
:更改在 git stash
期间恢复,而在 git stash pop
期间没有重新应用。请参阅this question。
git config --global alias.hidden '!git ls-files -v | grep "^[[:lower:]]"'
要取消跟踪已添加/初始化到您的存储库的文件,即停止跟踪文件但不将其从系统中删除,请使用:git rm --cached filename
*.config
添加到 .gitignore
,您可以执行 git rm --cached *.config
以停止跟踪所有 *.config
文件。
git update-index --assume-unchanged file.name
assume-unchanged
,或者--skip-worktree
作为替代方案。
是 - .gitignore
系统仅忽略当前不受 git 版本控制的文件。
即,如果您已经使用 git-add
添加了一个名为 test.txt
的文件,那么将 test.txt
添加到 .gitignore
仍会导致对 test.txt
的更改被跟踪。
您必须先 git rm test.txt
并提交该更改。只有这样,对 test.txt
的更改才会被忽略。
<file>
后创建新文件。我正在使用 git 1.8.1 版——如果这是问题所在。
git rm test.txt
,这里是更全面答案的链接stackoverflow.com/questions/12661306/…
删除 .gitignore 中的尾随空格
此外,请确保您的 .gitignore 中没有尾随空格。我之所以提出这个问题是因为我正在寻找答案,然后我有一种有趣的感觉,我应该打开编辑器而不是仅仅关注 .gitignore。从末尾删除了一个额外的空间,现在它可以工作了:)
echo node_modules >> .gitignore
时(至少在 Windows 上)
我按照这些步骤
git rm -r --cached .
git add .
git reset HEAD
之后, git 删除所有应该忽略的文件(在我的例子中是 *.swp)。
到处都是复杂的答案!
只需使用以下
git rm -r --cached .
它将从源文件中删除您试图忽略的文件,而不是从您计算机上的主文件中删除!
之后只需提交并推送!
如果您想停止跟踪文件而不从本地系统中删除文件,我更喜欢忽略 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
谢谢
要从跟踪中删除一些特定文件:
git update-index --assume-unchanged path/to/file
如果您想再次开始跟踪它:
git update-index --no-assume-unchanged path/to/file
正如 dav_i 所说,为了将文件保留在 repo 中并从更改中删除它而不创建额外的提交,您可以使用:
git update-index --assume-unchanged filename
git update-index --no-assume-unchanged filename
没有一个答案对我有用。
反而:
将文件移出 git 控制的目录 检查删除到 git 将文件移回 git 控制的目录
将文件移回后,git 将忽略它。也适用于目录!
不知道“回答”命令做了什么,我运行了它,这让我很沮丧。它递归地从您的 git 存储库中删除每个文件。
Stackoverflow 的救援... How to revert a "git rm -r ."?
git reset HEAD
成功了,因为我有不想覆盖的未提交的本地文件。
git rm -r --cached .
对我不起作用。即使 .tmproj 在我的全局忽略文件中,Git 仍然声称我的 textmate 项目文件没有被跟踪。不过,像这样重置我的本地复制是有效的。实际上,我在 git reset --hard HEAD
中添加了“硬”选项。在这种情况下,这应该具有几乎相同的效果。
--hard
标志。它将抛出任何未提交的更改而不发出警告!
对于像我这样的慢人可能还有另一个建议 =) 将 .gitignore 文件放入您的存储库根目录而不是 .git 文件夹中。干杯!
如果文件已经在版本控制中,您需要手动删除它们。
git rm --cached
和 git reset HEAD
这两个我非常熟悉的工具,并且可以从 repo 中获得它。成功来自第一个 rm --cached
,然后实际手动删除它,提交删除,然后手动重新创建它。它消失了。
rm foo/bar && git add -u && git commit -m "removed foo/bar" && git push
。然后运行 touch foo/bar && git status
将显示该文件现在已被正确忽略。
我遇到的另一个问题是我放置了一个内联评论。
tmp/* # ignore my tmp folder (this doesn't work)
这行得通
# 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 '<pathspec>' did not match any files
。这仅适用于尚未修改的文件。
s//$//
应该是 s/$//
吗?另外, sed 和 grep 命令的意义何在?我猜它是来自 gitignore 的评论过滤?
我发现 .gitignore 有一个奇怪的问题。一切都到位,似乎是正确的。我的 .gitignore 被“忽略”的唯一原因是行尾是 Mac 格式(\r)。因此,在使用正确的行结尾(在 vi 中使用 :set ff=unix)保存文件后,一切都像魅力一样!
.gitignore
格式是每一行都是注释(以 #
开头)或整行(包括任何空格)是完整的文件名模式。如果您在行中混入了 \r
,则 git
将仅忽略以 \r
结尾的文件(您可以根据需要创建这些文件!)。详见man gitignore
,值得一读。
这里没有提到的另一个问题是,如果你在 Windows 记事本中创建了 .gitignore,我发现它在其他平台上可能看起来像乱码。关键是确保您在记事本中将编码设置为 ANSI,(或像我一样在 linux 上制作文件)。
从我在这里的回答:https://stackoverflow.com/a/11451916/406592
如果你需要停止跟踪很多被忽略的文件,你可以结合一些命令:
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 .
删除了许多其他内容!
在我的服务器 linux 服务器上(在我的本地 dev mac 上不是这样),只要我不添加星号,目录就会被忽略:
www/档案/*
我不知道为什么,但它让我放松了几个小时,所以我想分享......
如果 .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 rm --cached filename
似乎不那么激烈恕我直言..