![](/img/trans.png)
[英]Git remote branch deleted, but still it appears in 'branch -a'
[英]The deleted folder still appears in git bash when using ls command
對於 C# 項目,我使用git rm -r --cached obj/
和git rm -r -f obj/
命令從目錄中刪除obj/
,但之后當我使用ls
我仍然可以在目錄中看到obj/
文件夾目錄。 當我再次嘗試使用git rm -r obj/
命令時,它告訴我fatal: pathspec 'obj/' did not match any files
,但我仍然可以使用cd obj/
查看所有應該被刪除的文件。
這是什么意思?
git rm
(沒有--cached
)應該從工作樹(您的磁盤)以及索引中刪除這些文件,前提是它們首先沒有被忽略。
檢查是否:
已經有一個忽略規則
git check-ignore -v obj/a_file_inside_obj
如果所有文件仍然存在,或者只有少數文件(可能不會被刪除,因為已被活動線程使用)
您在 Git 中使用的每個文件都有最多三個同時處於活動狀態的副本。 為了具體起見,讓我們談談名為obj/a
的文件(我假設有這樣一個文件)。
開始的時候三個地方都有一個obj/a
副本:
一個是——或者可能是——在你用git checkout master
或git switch master
選擇的提交中,或者你選擇了一個分支,因此選擇了一個提交。
Git索引中obj/a
第二個副本。 索引,也稱為暫存區,保存每個文件的副本1 ,准備進入您將進行的下一次提交。 索引中的副本首先由您的git checkout
或git switch
命令放在那里。 它會一直停留在那里,直到您對它做某事或為此做某事。
最后,您可以看到的obj/a
的唯一副本是您的工作樹或工作樹中的普通文件。
提交副本的原因是每次提交都保存所有文件的副本,作為提交的快照。 此副本一旦制作完成,就永遠無法更改。 任何提交的任何部分都不能被更改:所有提交都被永久凍結。
使用工作樹副本的原因是提交的副本不僅一直處於凍結狀態,而且還被壓縮為一種只有 Git 才能使用的特殊 Git-only 格式。 這有利於存檔,但對於實際完成任何工作無用。 Git 必須將其解壓並轉換回普通的日常文件,以便您可以使用它。 這也是您的工作樹被稱為“工作樹”或“工作樹”的原因:它是您工作的地方。
索引副本是沒有真正存在明顯理由的副本。 但是 Git 有一個。 2
當你跑:
git rm -r --cached obj/
Git 刪除了obj/a
的索引副本。 提交的副本無法刪除:它在提交中,並且任何提交的任何部分都不能更改。 obj/a
的工作樹副本(您可以看到和使用的副本)被留下了,因為當您說--cached
時,您告訴 Git --cached
。 所以現在你只剩下文件的兩個副本,而不是三個。
如果您想刪除文件的工作樹副本,請使用計算機的“刪除工作樹文件”命令,無論是什么( rm
,也許)。 如果你之前告訴 Git git rm -r obj/
你會指示 Git 刪除兩份副本:一份在索引中,一份在工作樹中。 現在索引副本消失了, git rm
不會刪除工作樹,因為工作樹副本現在是一個未跟蹤的文件。 所以現在你需要使用非 Git 命令。
(或者,您可以git add obj/a
,它將文件復制到索引中。現在它將再次出現在所有三個位置,現在git rm obj/a
將刪除索引和工作樹副本。)
1從技術上講,索引中的內容不是文件的實際副本,而是文件的名稱和模式以及對文件數據的引用,准備好放入新的提交中。 但是,除非您直接使用git ls-files --stage
開始檢查索引的內容,或者使用git update-index
更改索引的內容,否則這里的區別並不是那么重要。
2也就是說,Git 在那里有一份文件副本——盡管參見腳注 1。Git 也有一個原因:它使 Git 更容易成為 Git。 有些系統的工作方式與 Git 非常相似,但不必為索引而煩惱。 他們只是使用工作樹副本作為建議的下一次提交。 這可行,但速度較慢,並且不提供 Git 提供的某些功能。
git rm
只是從 git 中刪除文件。 如果要從文件系統中刪除文件,則應使用rm -rf ./obj
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.