让Git忘记已跟踪但现被列入.gitignore的文件的方法

让Git忘记已跟踪但现被列入.gitignore的文件的方法

技术背景

在使用Git进行版本控制时,.gitignore文件用于指定哪些文件或目录应被Git忽略,即不纳入版本控制。然而,当一个文件之前已经被Git跟踪,之后才被添加到.gitignore中时,Git仍然会继续跟踪该文件,即使它已经在.gitignore列表里。这就导致在编辑该文件后,它仍会出现在git status的结果中。为了解决这个问题,需要采取一些特定的方法让Git完全忘记该文件。

实现步骤

方法一:使用git rm --cached

此方法会将文件从Git的跟踪中移除,但不会删除本地文件。不过,需要注意的是,在其他开发者执行git pull时,该文件会被删除。

1
2
3
4
# 移除单个文件
git rm --cached <file>
# 递归移除文件夹及其所有文件
git rm -r --cached <folder>

之后,进行提交操作:

1
git commit -m "Stop tracking <file/folder>"

方法二:使用git update-index --skip-worktree

如果想保留文件在本地和仓库中,但让Git忽略对其的修改,可以使用此方法。

1
git update-index --skip-worktree <file>

若之后想恢复跟踪该文件,可使用以下命令:

1
git update-index --no-skip-worktree <file>

方法三:移除所有已跟踪文件并重新添加

该方法会移除所有已跟踪的文件,然后重新添加,同时会尊重.gitignore规则。

1
2
3
git rm -r --cached .
git add .
git commit -am "Remove ignored files"

方法四:使用git ls-filesxargs

此方法会列出所有被忽略的文件,并将它们从索引中移除。

1
2
git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

核心代码

使用git rm --cached示例

1
2
3
# 假设要移除的文件名为test.txt
git rm --cached test.txt
git commit -m "Stop tracking test.txt"

使用git update-index --skip-worktree示例

1
2
# 假设要忽略修改的文件名为config.ini
git update-index --skip-worktree config.ini

移除所有已跟踪文件并重新添加示例

1
2
3
git rm -r --cached .
git add .
git commit -am "Remove ignored files"

使用git ls-filesxargs示例

1
2
git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

最佳实践

  • 选择合适的方法:根据具体需求选择合适的方法。如果确定不再需要该文件在仓库中,可使用git rm --cached;如果想保留文件在仓库中,仅忽略本地修改,可使用git update-index --skip-worktree
  • 备份重要文件:在执行可能会删除文件的操作(如git rm --cached)之前,建议先备份重要文件,以防意外丢失。
  • 及时提交更改:在进行文件跟踪调整后,及时进行提交操作,确保所有开发者都能获取到最新的跟踪信息。

常见问题

使用git rm --cached后,其他开发者拉取代码时文件被删除

这是正常现象,因为git rm --cached会将文件从仓库中移除,其他开发者在执行git pull时会同步这个更改。如果不想让文件被删除,可考虑使用git update-index --skip-worktree

使用git update-index --assume-unchangedgit update-index --skip-worktree的区别

git update-index --assume-unchanged主要用于提高性能,防止Git检查大文件的状态;而git update-index --skip-worktree用于忽略已修改的跟踪文件,不让其被提交。建议优先使用git update-index --skip-worktree

执行git rm -r --cached .时提示权限问题

可能是由于当前用户对某些文件或目录没有足够的权限。可以尝试使用sudo命令以管理员权限执行,或者检查文件和目录的权限设置。


让Git忘记已跟踪但现被列入.gitignore的文件的方法
https://119291.xyz/posts/2025-04-16.git-forget-tracked-files-in-gitignore/
作者
ww
发布于
2025年4月16日
许可协议