簡體   English   中英

使用 ls 命令時,刪除的文件夾仍然出現在 git bash 中

[英]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 mastergit switch master選擇的提交中,或者你選擇了一個分支,因此選擇了一個提交。

  • Git索引obj/a第二個副本。 索引,也稱為暫存區,保存每個文件的副本1 ,准備進入您將進行的下一次提交。 索引中的副本首先由您的git checkoutgit 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM