it-swarm-ja.com

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

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

45
vitaliy4us

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

Gitはディレクトリを追跡しません。ファイルを追跡するだけです。

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

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

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

空のディレクトリを明示的に追跡する場合は、その中にファイルを作成する必要があります。 Gitは空のディレクトリを追跡しないので、ディレクトリ内のファイルをGitのインデックスに追加することで、追跡を行わせる必要があります。

通常、人々は追跡したいディレクトリに.gitkeepというファイルを保存しますが、当面はディレクトリを空のままにしておく必要があります。もちろん、ファイルanyに他の名前を付けることができますが、.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は空の「ツリー」で表されるため、空のディレクトリを格納できます。 here および here をさらに読んでください。

95
slhck

次の.gitignoreファイルを、リポジトリに含めるフォルダーに追加します。

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

.gitkeepの追加は機能しますが、公式の解決策ではありません。参照 https://stackoverflow.com/questions/7229885/what-are-the-differences-between-gitignore-and-gitkeep

6
sunknudsen

Gitはフォルダーを追跡しません。混乱の蓄積を防ぐために、インデックスが(間接的に)ディレクトリを参照することから参照しないように(ディレクトリに最後に登録されたファイルでgit rmのようなことを行うことによって)変更されると、Gitはその前のディレクトリを削除しようとしますインデックスに登録されていないため、追跡できなくなります。ディレクトリが実際に空になった(そして未登録のファイルが含まれていない)ためにGitが成功した場合、ディレクトリは削除されます。そうでない場合は、Gitがそれを認識していないため、ディレクトリが残ります。

2
user1077573

実行した場合、Gitはフォルダーを削除する可能性がありますgit clean-dffx(これらのオプションのサブセットを使用することもできます)。

@TRiGがコメントで言及しているように、コミットしたときにディレクトリが空の場合、GitHubなどには表示されません。gitはディレクトリを追跡しない(ファイルを追跡する)ためです。これらのファイルがあったツリーはありません。ファイルがないため関連性が高く、ツリーもありません。

詳細がなければ、根本的な質問に適切に回答することは事実上不可能です(何が起こったのですか?)。

1
D. Ben Knoble