簡體   English   中英

git clean -fd 不刪除文件夾

[英]git clean -fd not removing a folder

我在~/foo文件夾中有一個 GIT 存儲庫。 現在,在~/foo/public/bar/下創建了一個bar/文件夾,其中包含一些內容。 它被 GIT 正確識別為未跟蹤:

~/foo git status -s
?? public/bar/

我一直使用git clean -fd來刪除未跟蹤的文件夾,但由於某種原因它不起作用。 當我運行它時,什么也沒有發生:

~/foo git clean -fd
~/foo git status -s
?? public/bar/

GIT 有什么變化還是我遺漏了什么? 我正在使用 GIT 2.32.0。

Git 對文件夾本身完全不感興趣:只有文件未被跟蹤(因為也只有文件被跟蹤)。 1所以當git status說:

 ?? public/bar/

它隱藏了一些東西。 它隱藏的事實是public/bar/下至少有一個文件

運行git clean -fd不一定會刪除這個未跟蹤的文件。 特別是,如果沒有-x-Xgit clean會避免刪除任何被忽略的未跟蹤文件。

正如IMSoP 在評論中提到的那樣,使用git status --untracked-files=all --ignored可以獲得更多信息。 我們將在public/bar/中看到各種文件的名稱。 git status在這里所做的是請注意,當它可以通過宣布包含目錄public/bar/ (帶有尾部斜杠)來總結有多個文件時,無需逐個宣布每個文件。


1這並不完全正確,因為有子模塊,但它足夠接近讓人們思考這個問題。 此外, git clean文檔-d選項的描述下談到了“未跟蹤的目錄”,那么這意味着什么? 線索在-x-X選項的描述中:

-x
不要使用標准的忽略規則......

通常這里缺少一些東西,這就是忽略規則的工作方式。 即使是我截取的部分中提到的 gitignore 文檔,也沒有涵蓋關鍵細節,即:

  • 要查找未跟蹤的文件,Git 必須遍歷工作樹中的文件樹。 也就是說,它必須查看每個目錄(或文件夾,如果您更喜歡該術語)以查看該目錄中存在哪些文件。
  • 遍歷文件樹——打開和讀取目錄以獲取文件列表,然后遞歸地打開和讀取每個子目錄——速度很慢。
  • Gitignore 規則—— .gitignore文件中忽略特定模式的行——可以列出目錄名稱,可以使用尾部斜杠顯式列出,也可以因為目錄名稱與某些 gitignore 行匹配而隱式列出。
  • 因此,如果 Git 可以提前確定目錄的每個文件(例如public/bar/都將被忽略,則 Git 可以簡單地避免打開該目錄並讀取它。 沒有意義:Git 在這里找到的所有內容都將被忽略!

最后一個要點中的快捷方式可以節省時間。 在大型構建中,在典型的現代系統上,它可以在git status運行中節省幾秒鍾(有時幾十秒,甚至更大的數量級)。 所以git statusgit clean盡可能利用這一點。 但是,當他們必須枚舉某些將忽略所有內容的目錄中的實際文件時,他們仍然必須打開並讀取該目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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