web-dev-qa-db-ja.com

Gitチェックアウト/プルはディレクトリを削除しませんか?

リポジトリ@ githubがあります。家で仕事をして、GitHubにプッシュしました。ファイルとディレクトリの削除が必要でした。これで、ファイルとディレクトリを削除する前にコードのコピーを持っていた私の作業ボックスにいます。

以下を発行しました。

git remote update
git checkout HEAD
git pull Origin HEAD

必要なファイルはすべて削除されましたが、ファイルがあったディレクトリは削除されませんでした。

2つの質問:

  1. ディレクトリを削除しなかったのはなぜですか?
  2. それらを削除するために現在の状態で発行できるgitコマンドはありますか?
76
mculp

Gitはディレクトリを追跡しないため、マージやその他の変更の結果として空になったディレクトリは削除されません。ただし、git clean -fd追跡されていないディレクトリ(-fdフラグは、f orce追跡されていないファイルの削除とd irectoriesを意味します。

146
mipadi

作業ツリーを変更するほとんどの操作(プル、マージ、チェックアウトなど)の一部として、gitはその操作によって空になったディレクトリをすべて削除します(つまり、gitは最後のファイルを削除しました)。

gitは完全に空ではないディレクトリを削除しません。そのため、ファイルを非表示または無視した場合、gitがそのディレクトリから最後のtrackedファイルを削除するからといって、必ずしもgitになるわけではありませんそのディレクトリを削除できます。 gitはこれをエラー状態と見なさないため、文句を言うことはありません。

3
CB Bailey

Gitはディレクトリ、ファイル(およびそのパス)を追跡しません。 Gitは、それらのパスがまだ存在しない場合はすべてのディレクトリを作成しますが(クール!)、ただし、notパスは移動または削除されます(クールではありません☹...しかし、理由があります)。

Solution(いったんプル/早送り/マージしたら):

git stash --include-untracked
git clean -fd
git stash pop

stashの前にcleanを付けないと、すべての未追跡ファイルが(不可逆的に)失われます。

注:これにより、無視されたファイルもすべて消去されるため、プロジェクトメタデータを再作成するために、ビルドスクリプトの一部を再度実行する必要がある場合があります(例:./gradlew Eclipse)。これにより、空で、gitファイルのパスの一部ではないディレクトリも削除されます。

2
qwertzguy