我将一个之前被 Git 追踪的文件放到了.gitignore
清单中。然而,即使在编辑过后,该文件仍然出现在 git status
中。我该如何强制 Git 完全忘记这个文件?
.gitignore
可以防止未跟踪的文件被添加到Git跟踪的文件集中(如果没有使用add -f
)。但是,Git将继续跟踪任何已经被跟踪的文件。
要停止跟踪一个文件,我们必须从索引中删除它:
git rm --cached <file>
要递归地删除一个文件夹及其内部的所有文件:
git rm -r --cached <folder>
从主干上删除文件将在下一次提交时发生。
警告:虽然这不会从您的本地计算机中删除物理文件,但它会在其他开发人员进行下一次git pull
时从他们的计算机中删除这些文件。
git add .
命令会将其添加到索引中,下一次提交会把它提交到仓库中。为了避免这种情况,在执行完所有mataal说的操作后,请立即执行以下命令: git update-index --assume-unchanged <路径和文件名>
。 - Daogit rm -r -q --cached .
- Aaron Blenkushgit pull
时,这将会删除该文件。 - Petr Pellergit rm -r --cached .
git add .
那么:
git commit -am "Remove ignored files"
或者简短地说:
git rm -r --cached . && git add . && git commit -am "Remove ignored files"
git pull
命令时,文件将被删除。 - Petr Pellergit rmignored
。 - Berik.gitignore
中的无用文件。如果你的 git status
太杂乱,可能很难找出这些文件。最好使用一个仅删除新忽略文件的命令。这就是为什么我更喜欢 thSoft 的回答。 - KurzedMetalgit update-index
可以胜任这个工作:
git update-index --assume-unchanged <file>
注意: 这个解决方案实际上与 .gitignore
无关,因为 gitignore 只作用于未跟踪的文件。
自从这个答案发布以来,一个新的选项已经被创建,应该优先使用。您应该使用 --skip-worktree
来处理修改过的已跟踪文件,用户不想再提交它们,并使用 --assume-unchanged
提高性能,以防止 git 检查大型已跟踪文件的状态。有关更多详细信息,请参见https://dev59.com/nWYr5IYBdhLWcg3wfaSc#13631525 ...
git update-index --skip-worktree <file>
取消。git update-index --no-skip-worktree <file>
git status
,而且非常直观。谢谢。 - Pablo Olmos de Aguilera C.git update-index --assume-unchanged <path> …
会导致 Git 忽略指定路径的更改,无论 .gitignore
中是否包含该路径。如果你从远程拉取数据,并且该远程仓库对该路径进行了修改,Git 将在合并时失败并抛出冲突,需要手动解决冲突。git rm --cached <path> …
会导致 Git 停止跟踪该路径。如果您没有将该路径添加到.gitignore
中,则在以后的 git status
中将看到该路径。第一个选项可减少 Git 提交历史中的噪音,并允许将来分发“被忽略”的文件的更改。 - ManicDeegit ls-files -c --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"
这个命令会获取被忽略文件的列表,从代码仓库中删除它们,并提交更改。
git ls-files --ignored --exclude-standard | xargs git rm
。我认为这是最好的答案!因为它非常清晰、符合Unix方式,并且以直接的方式完成所需操作,而不会产生其他更复杂命令的副作用。 - imz -- Ivan Zakharyaschevls-files
没有匹配到任何内容,git rm
将会报错。使用xargs -r git rm ...
告诉xargs
如果没有匹配到文件,则不要运行git rm
。 - Wolfganggit ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached
- Nils-o-matgit rm --cached -r .; git add .; git status; git commit -m "Ignore unwanted files"
.gitignore
文件的内容。它会忽略已经提交到Git仓库的文件,但现在我们已经将它们添加到.gitignore
中。git status;
是用来查看更改的,可以省略。git commit -m "忽略不需要的文件"
)。先将它移出去,提交更改,然后再将其移回来。
这种方法在过去对我有效,但可能有更好的“Git”方式来实现这一点。
git pull
时删除其他人的文件。 - Álvaro González我总是使用这个命令来删除那些未被跟踪的文件。 一行,Unix风格,干净的输出:
我经常使用这个命令来清除那些未被跟踪的文件。一行代码,Unix式的简洁输出:git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached
它列出了您所忽略的所有文件,将每个输出行替换为带引号的行以处理路径中包含空格的情况,并将所有内容传递给git rm -r --cached
以从索引中删除路径/文件/目录。
git ls-files --ignored --exclude-standard
,让你首先了解/验证新.gitignore
将要排除/删除哪些文件,然后再执行最终的git rm
。 - JonBrave\n
会导致程序执行失败。我已发布了解决方案以应对这种情况。 - JonBravesed: 1: "s/.*/": unterminated substitute in regular expression
(似乎在filter-branch之外是可以工作的)。我改用了@JonBrave的答案中提到的git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
。 - goofology来源:在基于.gitignore的Git存储库中取消跟踪已添加的文件
假设你已经把一些文件添加/提交到你的Git存储库,并将它们添加到你的.gitignore文件中;这些文件仍然存在于你的存储库索引中。本文将介绍如何摆脱它们。
在继续之前,请确保所有更改都已提交,包括你的.gitignore文件。
为了清除你的存储库,请使用:
git rm -r --cached .
rm
命令可能是不可挽回的。如果您希望事先尝试它的功能,请添加 -n
或 --dry-run
标志以测试一下。
git add .
git commit -m ".gitignore fix"
您的代码库很干净 :)
将更改推送到远程仓库,以便在那里看到更改的生效。
git rm
删除跟踪文件(请注意,即使是您执行git rm --cached
,当其他人获取此更改时,他们的文件系统中的文件也将被删除)。这通常是因为配置文件覆盖,身份验证凭据等原因所导致的。请查看https://gist.github.com/1423106,了解人们解决此问题的方法。git checkout <oldref> -- <filename>
一样容易 - 但是这样会被检出并被忽略。 - amenthes--assume-unchanged
):要么这是灵验的,应该被驳回,要么你可以解释为什么(我相信),它变得有用。 - Romain Valeri我使用 git filter-branch 实现了这个功能。我使用的确切命令来自于 man 页面:
警告: 这将从您的整个历史记录中删除该文件。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
这个命令将重新创建整个提交历史,在每次提交之前执行git rm
以删除指定的文件。在运行命令之前不要忘记备份,因为它会被永久删除。
git clean -X
听起来很相似,但这不适用于仍被Git跟踪的文件。我写这篇文章是为了帮助任何正在寻找解决方案的人不要走错路。 - imz -- Ivan Zakharyaschevgit update-index --assume-unchanged
。这个解决方案 1) 保留文件在服务器上(索引),2) 让您在本地自由地修改它。 - Qwerty--skip-worktree
,请参考:https://dev59.com/nWYr5IYBdhLWcg3wfaSc#13631525。 - Doppelgangergit update-index --assume-unchanged <file>
是正确的,这个文件将会留在仓库中并且更改不会被添加到git add
中。如果是 NO (例如缓存文件、生成的文件等),那么git rm --cached <file>
将会从仓库中移除它。 - Martin--assume-unchanged
,这是为了提高性能,以防止 Git 检查大型跟踪文件的状态,而更喜欢使用--skip-worktree
,这是用于修改过的已跟踪文件,用户不再想提交的文件。请参见 https://dev59.com/nWYr5IYBdhLWcg3wfaSc#13631525 - Philippe