Git 會刪除空資料夾嗎?

Git 會刪除空資料夾嗎?

我刪除了工作資料夾中某個目錄中的所有文件,但該目錄本身仍然存在。將變更推送到遠端儲存庫後(GitHub)我檢查了我的項目,發現該目錄消失了。 Git 有可能刪除空白資料夾嗎?

答案1

為什麼不顯示目錄?

Git 不追蹤目錄;它只跟踪文件。

如果目錄中沒有文件,則在新增或刪除文件時該目錄對於 Git 而言並不「存在」。特別是,當您刪除目錄中的所有檔案並將變更新增至索引時,目錄將從 Git 的索引中消失。反之亦然,git add如果目錄為空,則不會新增 via。

換句話說:如果您可以在文件瀏覽器中本地看到該目錄,但它從GitHub 中消失,則您很可能從該目錄中刪除了所有文件,將該更改添加到索引中,然後提交並推送它。

那麼如何追蹤空目錄呢?

如果要明確追蹤空目錄,則必須在其中建立一個檔案。由於 Git 不會追蹤空目錄,因此您必須透過將目錄中的檔案新增至 Git 的索引來欺騙它這樣做。

通常,人們會將一個名為的檔案儲存.gitkeep在他們希望追蹤的目錄中,但該目錄暫時應保持為空。你可以給文件任何當然還有其他名稱,但該名稱.gitkeep是一種約定。大多數系統上的檔案清單不會顯示該.gitkeep檔案(由於以 開頭)。.

除了 之外.gitkeep,一些用戶還喜歡README在那裡放置一個文件,最好有一個簡短的描述,說明為什麼該目錄首先必須存在。

例子

$ mkdir foo
$ git init
$ git add .
$ git ls-files   # which files does Git know about?
                 # apparently, none
$ touch foo/bar  # create a file in the directory
$ git add .
$ git ls-files   # does Git know about it now?
foo/bar          # yep!

在這裡,foo只有當檔案位於目錄中時,目錄才會新增到索引中。

如果我真的想要追蹤一個空目錄?

總而言之,原則上,底層資料結構允許 Git 儲存空目錄,因為它將由空「樹」表示。一些進一步的閱讀這裡這裡

答案2

將以下.gitignore文件新增至您希望包含在儲存庫中的資料夾。

# Ignore everything in this directory
*
# Except this file
!.gitignore

添加.gitkeep有效,但不是官方解決方案。看https://stackoverflow.com/questions/7229885/what-are-the-differences- Between-gitignore-and-gitkeep

答案3

git clean如果您執行-dffx(甚至可能使用這些選項的子集),Git 可能會刪除資料夾。

正如 @TRiG 在評論中提到的,如果您提交時目錄為空,它不會顯示在例如 GitHub 中,因為 git 不跟踪目錄(它跟踪文件)——這些文件所在的樹是不存在的不再相關,因為沒有文件,所以沒有樹。

如果沒有更多細節,我們實際上不可能正確回答您的基本問題(發生了什麼事?)。

答案4

對於 Linux / MAC OSX,使用以下一行程式碼,以遞歸方式建立/將空佔位符檔案放入資料夾中,以防止它們被 git 忽略:

find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;

希望這對某人有幫助。

相關內容