Git は空のフォルダーを削除しますか?

Git は空のフォルダーを削除しますか?

作業フォルダ内のディレクトリからすべてのファイルを削除しましたが、ディレクトリ自体はまだ存在しています。変更をリモートリポジトリにプッシュした後(GitHub) プロジェクトを確認したところ、ディレクトリが消えていることに気付きました。Git が空のフォルダを削除する可能性はありますか?

答え1

ディレクトリが表示されないのはなぜですか?

Git はディレクトリを追跡せず、ファイルのみを追跡します。

ディレクトリにファイルがない場合、ファイルの追加や削除時にそのディレクトリは Git に「存在」しません。特に、ディレクトリ内のすべてのファイルを削除してその変更をインデックスに追加すると、ディレクトリは Git のインデックスから消えます。逆に、ディレクトリがgit add空の場合は追加されません。

つまり、ファイル ブラウザーでローカルのディレクトリを表示できるのに、GitHub から消えた場合は、ディレクトリからすべてのファイルを削除し、その変更をインデックスに追加して、コミットしてプッシュした可能性が高くなります。

では、空のディレクトリを追跡するにはどうすればよいでしょうか?

空のディレクトリを明示的に追跡したい場合は、その中にファイルを作成する必要があります。Git は空のディレクトリを追跡しないので、ディレクトリ内のファイルを 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/gitignore と gitkeep の違いは何ですか?

答え3

Gitgit cleanを実行すると-dffx(おそらくそれらのオプションのサブセットを使用しても) フォルダーが削除される可能性があります。

@TRiG がコメントで述べているように、コミット時にディレクトリが空の場合、git はディレクトリを追跡しない (ファイルを追跡する) ため、たとえば GitHub には表示されません。ファイルがないため、それらのファイルがあったツリーはもはや関連がなく、ツリーも存在しません。

より詳細な情報がなければ、あなたの根本的な質問に適切に答えることは事実上不可能です(どうしたの?)。

答え4

Linux / MAC OSX の場合、次のワンライナーを使用して、空のプレースホルダー ファイルをフォルダーに再帰的に作成/配置し、git によって無視されないようにします。

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

これが誰かの役に立つことを願います。

関連情報