为什么git rm --cached不会删除本地曾经跟踪的文件,而是其他

时间:2019-04-13 08:02:28

标签: git caching gitignore git-rm

取消跟踪git存储库中的文件时,请使用git rm -r --cached .。这不会删除本地存储中曾经跟踪的文件,但是当其他开发人员使用git pull获取此提交时,永远跟踪的文件将在其计算机存储中被删除。

您可以使用以下方式重现它:

  1. 保存当前工作。 (机器A
git add .
git stash save "work position"
  1. 创建一个新文件并提交。(机器A
echo hello>>file_not_to_track
git add .
git commit -m "add file file_not_to_track"
  1. 从另一台计算机(或另一目录)中拉出(机器B
git pull

立即显示文件

ls
file_not_to_track  README.md
  1. 取消跟踪文件。(机器A
echo file_not_to_track >> .gitignore
git rm -r --cached .
git add .
git commit -m "untrack file_not_to_track"
git push

立即显示文件

ls
file_not_to_track  README.md
  1. 获取代码(机器B
git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From example.com:my/example_project
   6525df1..f413f8b  master     -> origin/master
Updating 6525df1..f413f8b
Fast-forward
 .gitignore        | 1 +
 file_not_to_track | 1 -
 2 files changed, 1 insertion(+), 1 deletion(-)
 create mode 100644 .gitignore
 delete mode 100644 file_not_to_track

立即显示文件

ls
README.md

它显示git rm -r --cached .删除其他存储库中曾经跟踪的文件,但不删除当前存储库中的文件。

3 个答案:

答案 0 :(得分:3)

git rm --cached跟踪从git删除文件的更改,但不删除本地副本。在本地运行ls仍会显示本地文件,但是如果从另一台计算机上拉出,则将应用删除该文件的更改,然后删除该文件。

答案 1 :(得分:3)

在计算机A上:

git rm -r --cached .

以上命令将从索引( README.md和file_not_to_track )中删除文件。目前,索引为空。但是,文件系统上仍存在file_not_to_track。

  

-已缓存:使用此选项取消登台并仅从索引中删除路径。工作树文件,无论是否修改,都将被保留。

git add .

使用 add 操作,git仅添加了 README 文件。 (file_not_to_track已被忽略)。

在计算机B上:

  

更改了2个文件,插入了1个(+),删除了1个(-)

通过 pull 操作,git识别到 file_not_to_track 已经消失。 Git执行一个灵巧的动作。

答案 2 :(得分:3)

这是选项-cached 的工作方式,它从git索引中删除文件。工作树文件将被保留。但是,Git将不再在您的本地存储库中跟踪此文件。

在此处查找--cached选项:

https://git-scm.com/docs/git-rm