ノーブランチの下にあるgitコミットのリストと削除(ぶら下がっていますか?)

StackOverflow https://stackoverflow.com/questions/3765234

  •  04-10-2019
  •  | 
  •  

質問

私は特定のブランチの下にない多くのコミットを備えたGitリポジトリを持っています、私はできます git show 彼らは、それらを含むブランチをリストしようとすると、何も報告しません。

これは垂れ下がったコミット/ツリーの問題だと思ったので(-Dブランチの結果として)、私はレポを剪定しましたが、それでも同じ動作が見られます。

$ git fetch origin

$ git fsck --unreachable
$ git fsck

出力も、ぶら下がっているものもありません(そうですか?)。しかし、コミットは存在します

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...

そして、それはどのブランチとしても到達できません

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

出力を与えません。

そのコミットの状態は正確には何ですか?同様の状態ですべてのコミットをリストするにはどうすればよいですか?どうすればそのようにコミットを削除できますか?

役に立ちましたか?

解決

出力も、ぶら下がっていません(そうですか?)

あなたのリフェログから言及されたコミットは到達可能であると見なされることに注意してください。

そのコミットの状態は正確には何ですか?同様の状態ですべてのコミットをリストするにはどうすればよいですか

パス --no-reflogs 納得させる git fsck それらをあなたに見せるために。

どうすればそのようにコミットを削除できますか?

リフェログエントリが期限切れになると、それらのオブジェクトはによってクリーンアップされます git gc.

有効期限は、によって規制されています gc.pruneexpire, gc.reflogexpire, 、 と gc.reflogexpireunreachable 設定。 cf. git help config.

デフォルトはすべて非常にリーズナブルです。

他のヒント

すべてのぶら下がっているコミットを削除するには、リフェログから到達可能なものを削除するためにこれを行います。

git reflog expire --expire-unreachable=now --all
git gc --prune=now

しかし、これがあなたが望むものであることを確認してください。私はあなたが男のページを読むことをお勧めしますが、ここに要点があります:

git gc到達不可能なオブジェクト(コミット、ツリー、ブロブ(ファイル))を削除します。一部のブランチの歴史の一部ではない場合、オブジェクトは到達できません。実際、それはもう少し複雑です:

git gc 他のことはありますが、ここでは関連性がなく、危険ではありません。

2週間未満の到達不可能なオブジェクトは削除されないので、使用します --prune=now これは、「今までに作成された到達不可能なオブジェクトを削除する」ことを意味します。

オブジェクトは、リフェログを通して到達することもできます。ブランチはいくつかのプロジェクトの歴史を記録しますが、リフログはこれらのブランチの歴史を記録します。修正、リセットなど。コミットはブランチの履歴から削除されますが、Gitは、あなたが間違いを犯したことに気付いた場合に備えてそれらを保持します。リフェログは、ブランチ(またはヘッド)でどのような破壊的な(およびその他の)操作が実行されたかを調べるための便利な方法であり、破壊的な操作を取り消すのが容易になります。

そのため、ブランチから到達不可能なものを実際に削除するには、リフレグを削除する必要があります。期限切れにすることでそうします --all リフログ。繰り返しますが、Gitはユーザーを保護するためにリフレグを少し保持しているので、私たちは再びそうしないように言わなければなりません: --expire-unreachable=now.

私は主にリフェログを使用して破壊的な操作から回復しているので、私は通常使用します --expire=now 代わりに、リフログを完全にzapします。

このスレッドのすべてのアドバイスに従った後、私は同じ問題を抱えていました。

git reflog expire --expire-unreachable=now --all
git gc --prune=now
git fsck --unreachable --no-reflogs   # no output
git branch -a --contains <commit>     # no output
git show <commit>                     # still shows up

それがリフログではなく、枝ではない場合、それは タグ!

git tag                             # showed several old tags created before the cleanup

タグを削除しました git tag -d <tagname> そして、クリーンアップを再生し、古いコミットはなくなりました。

git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

おそらくある必要があります

git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042

リモコンからのブランチについても報告します

同様の問題がありました。走った git branch --contains <commit>, 、そして、質問のように出力を返しませんでした。

しかし、走った後でも

git reflog expire --expire-unreachable=now --all
git gc --prune=now

私のコミットはまだ使用してアクセスできました git show <commit>. 。これは、その戸建て/ぶら下がった「枝」のコミットの1つがタグ付けされたためです。タグを削除し、上記のコマンドを再び実行し、ゴールデンでした。 git show <commit> 戻ってきた fatal: bad object <commit> - まさに私が必要としていたもの。うまくいけば、これは私と同じように立ち往生していた他の誰かを助けます。

git gc --prune=<date> デフォルトでは、2週間以上前のオブジェクトをプルンすることができます。最近の日付を設定できます。ただし、緩いオブジェクトを作成するGITコマンドは、一般にGit GC -autoを実行します(これは、数値が構成変数GC.autoの値を超える場合にゆるいオブジェクトを除去します)。

これらのコミットを削除したいですか? GC.autoのデフォルト設定により、ゆるいオブジェクトが不合理な量のメモリを占有しないことを保証し、ゆるいオブジェクトをある程度保存することは一般的に良い考えです。そうすれば、明日、削除されたブランチに必要なコミットが含まれていることに気付いた場合、それを回復することができます。

私は誤って同じ状況にぶつかり、私の隠し場所には到達不能なコミットへの言及が含まれていることがわかりました。

これらは私がそれを本当に到達できないようにするために私がしたことでした。

git stash clear
git reflog expire --expire-unreachable=now --all
git fsck --unreachable
git gc --prune=now
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top