Git のチェックアウト/プルではディレクトリは削除されませんか?
質問
私のリポジトリは @ github にあります。自宅で少し作業してgithubにプッシュしました。これには、ファイルとディレクトリの削除が含まれていました。今、私は作業ボックスにいます。そこには、ファイルとディレクトリを削除する前のコードのコピーがありました。
私は以下を発行しました:
git remote update
git checkout HEAD
git pull origin HEAD
存在するはずのファイルはすべて削除されましたが、ファイルが存在していたディレクトリは削除されませんでした。
2 つの質問:
- なぜディレクトリを削除しなかったのでしょうか?
- 現在の状態でそれらを削除するために発行できる git コマンドはありますか?
解決
Gitは、ディレクトリを追跡していないので、マージまたはその他の変更の結果として、空になったものは削除されません。ただし、(git clean -fd
フラグ手段人跡未踏のファイルののF のORCEの除去をし、のD のirectoriesを)追跡されていないディレクトリを削除する-fd
を使用することができます。
他のヒント
作業ツリー(等、チェックアウト、マージ、プル)Gitは、その操作によって空にされているすべてのディレクトリを削除します(すなわちGitが最後のファイルを削除)変更ほとんどの操作の一部として
あなたがファイルを非表示にしたり、無視しているので、もしGitはの最後を削除するという理由だけで、gitのは、その後、完全に空でない任意のディレクトリを削除しないであろう、そのディレクトリから
のファイルが必ずしもことを意味するものではありません追跡Gitはそのディレクトリを削除することができます。 gitが、これはエラー状態であることを考慮していないので、それについて文句を言うことはありません。Git はディレクトリやファイル (パスも含めて) を追跡しません。Git は、これらのパスがまだ存在していない場合は (素晴らしい!)、そのパスのすべてのディレクトリを作成しますが、実際には作成されます。 ない パスに含まれるすべてのファイルが移動または削除された場合は、それらを削除します (クールではありません ☹ ...しかし理由があります)。
解決 (プル/早送り/マージ後):
git stash --include-untracked
git clean -fd
git stash pop
そうしないと stash
前に clean
, 、追跡されていないファイルはすべて (不可逆的に) 失われます。
注記:これにより無視されたファイルもすべて削除されるため、プロジェクトのメタデータを再作成するためにビルド スクリプトの一部を再度実行する必要がある場合があります (例: ./gradlew eclipse
)。これにより、空のディレクトリや git ファイルのパスの一部ではなかったディレクトリも削除されます。
現在、Git はディレクトリを追跡しません (「 git ウィキ), つまり、空のディレクトリを追加したり、空になったディレクトリを git delete したりすることはできません。 (編集: ありがとう、マンニ、私は間違っていました!あなたはできません 追加 ディレクトリは空ですが、git は 取り除く 追跡されたコンテンツが削除されたために空になったディレクトリ。)
空のディレクトリを削除するコマンドについては、次のようになります。それはオペレーティング システムによって異なります。
Linux の場合、次のように使用できます。
find -depth -type d -empty -exec rmdir {} \;
ただし、これにより削除されます 全て 空のディレクトリ!