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


84

私は自分のリポジトリ@githubを持っています。私は自宅でいくつかの作業を行い、それをgithubにプッシュしました。これには、ファイルとディレクトリの削除が含まれていました。今、私は自分のワークボックスにいます。ファイルとディレクトリを削除する前にコードのコピーがありました。

私は以下を発行しました:

git remote update
git checkout HEAD
git pull origin HEAD

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

2つの質問:

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

同意しました。HEADは現在チェックアウトされているコミットを指す参照であるため、git checkoutHEADは何もしません。どちらの場合も、おそらくマスターを目指していたでしょう。
Cascabel

さて、HEADは空のディレクトリを削除することを除いて実際にすべてを更新しました。私が言ったように、私はgitに不慣れです。
mculp 2009

重複の可能性「gitpull」にローカルファイルを上書きさせるにどうすればよいですか? それでもいくつかの異なる解決策が必要な場合は、そこで回答を確認してください。
DrBeco 2017年

回答:


153

Gitはディレクトリを追跡しないため、マージやその他の変更の結果として空になったディレクトリは削除されません。ただし、使用することができますgit clean -fd人跡未踏のディレクトリ(削除する-fdフラグ手段F人跡未踏のファイルとのORCE除去D irectoriesを)。


4
よくわかりません。それでは、変更をコミット/プッシュしたときに、GitHubリポジトリからディレクトリが削除されたのはなぜですか?
mculp 2009

1
作業コピーのディレクトリに追跡されていないファイル(追跡されていない非表示のファイルを含む)が含まれている可能性があるため、空のように見えても実際には空ではないため、Gitはそれらを削除しませんでした。git cleanもちろん、そうします。
mipadi 2009

4
GitHubリポジトリがベアリポジトリである(作業コピーがない)という事実と関係があるかもしれませんが、ローカルリポジトリにはあります。GitHubオリジンから新しいリポジトリのクローンを作成した場合、それらのディレクトリはありません。
mipadi 2009

18
ただし、もちろん、最初にでは-nなく(ドライラン)を使用してコマンドを実行すると、-f何が削除されるかを確認できます。特に、これらの厄介なディレクトリだけでなく、追跡されていないファイルもgit clean -d削除するためです。
トッドオーウェン

2
@EliGolin:オプションgit cleanを渡さない限り、.gitignoreにリストされているファイルは削除されません-x
mipadi 2016年

4

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

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


私のGitHubリポジトリにはディレクトリがありません。コミットすると、ディレクトリが正しく削除されました。ただし、チェックアウト/プルすると、ファイルのみが削除されます。ディレクトリは空です。$ ls -al total 8 drwxr-xr-x 2 mculp mculp 4096 Sep 23 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 Sep 30 10:51 ../
mculp

1
「HEADをマスターに切り替えた」とはどういう意味かよくわかりませんが、「git checkout master」という意味だと思いますが、ほとんどの人は「マスターに切り替えた/チェックアウトした」と言うでしょう。とにかく、gitが「すでに最新」と言ったとき。それは何もしなかったことを意味します。gitは空にしたディレクトリのみを削除します。
CBベイリー

悪い言い回し。コメントで示唆されているように、「HEAD」を「master」に変更しました。
mculp 2009

@CharlesBailey、あなたが言ったことは私が見ているものではありません。git checkout完全に空のディレクトリを削除しませんでした。
acumenus 2013年

@ABB:Gitは唯一されているディレクトリを削除作られたチェックアウト操作で空を。私はこれをもう一度テストしました。それはまだ動作します。
CBベイリー

3

ビルドサービス(CI)の場合も同じ問題がありました。GITがフォルダーをクリーンアップせずにすべてのファイルをプルするため、CIによって以前にビルドされたすべてのbin / objがダーティであるため、テストプロジェクトを削除すると、ビン引き続きDLLが含まれ、存在しないテストについて言及します。

この問題を解決するために; このコマンドは(少なくとも私にとっては)トリックを行うようです

git clean -fd -x

Xは、追跡されていないすべてのファイルを削除します。

-XGitによって無視されたファイルのみを削除します。これは、すべてを最初から再構築するのに役立つ場合がありますが、手動で作成したファイルは保持します。


2

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

解決策(プル/早送り/マージした後):

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

stash以前cleanにそうしなかった場合、追跡されていないすべてのファイルが(不可逆的に)失われます。

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


-1

Gitは現在ディレクトリを追跡していません(git wikiを参照)。つまり、空のディレクトリを追加したり、空になったディレクトリをgitで削除したりすることはできません。 (編集:ありがとう、マニ、私は間違っていました!空のディレクトリを追加することはできませんが、追跡されたコンテンツが削除されたために空になったディレクトリはgitによって削除されます。

空のディレクトリを削除するコマンドについて:オペレーティングシステムによって異なります。

Linuxの場合、たとえば、

find -depth -type d -empty -exec rmdir {} \;

ただし、これによりすべての空のディレクトリが削除されます


1
ウィキページには、gitは空のディレクトリを作成しないと書かれています。空のディレクトリを削除しない言っていませ。mculpが望んでいることは私のために働きます。
innaM 2009

@janko、実際、gitは完全に空のディレクトリを削除できませんでした。
acumenus 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.