0

Diff.java私の同僚が、GitHub リポジトリの履歴からファイル ( ) を完全に削除しようとしました。

彼がこれをやりたいと思ったのには十分な理由がありましたが、かなりの数のファイルが失われ、接尾辞が.REMOVED.git-id. たとえばivy-2.2.0.jar-> ivy-2.2.0.jar.REMOVED.git-id.

たまたまローカルにコピーを持っていたので、メインの開発ブランチを修復することができました。ただし、開発ラインの歴史的な分岐やリリースのタグが多数あり、現在は上記のように壊れているようです。

彼が次のようなプロセスを実行したことを理解しています。

$ git clone --mirror git://example.com/some-big-repo.git
$ java -jar bfg-1.12.3.jar --strip-biggest-blobs 500 some-big-repo
$ cd some-big-repo
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git push

$ cd ..
$ java -jar bfg-1.12.3.jar --delete-files Diff.java some-big-repo
$ cd some-big-repo
$ git push

このプロセスは破壊的であり、これが発生する前にクリーンなミラーがどこかにない限り、回復する方法はないと推測しています。誰かが確認したり、アドバイスを提供したりできますか?

4

1 に答える 1

1

これは、古い jar ファイルをすべて削除する手順です。

$ java -jar bfg-1.12.3.jar --strip-biggest-blobs 500 some-big-repo

...BFG の作成者として、--strip-biggest-blobs 500私は思ったほど明確ではなかったことに気がつきませんでした。このコマンドは、最大 500 個のファイル (大きなファイル、またはバイナリ ラージ オブジェクト: 'blob') をリポジトリ履歴から削除します。ユーザーがそのステップで何をすると思ったのか知りたいです!

これは、正しく削除されたコマンドですDiff.java:

$ java -jar bfg-1.12.3.jar --delete-files Diff.java some-big-repo

BFGの説明では、BFGを実行する前にリポジトリのバックアップを作成する必要があります」と書かれていますが、ここではそうではないようです。

次の 2 つの条件を考慮すれば、古いブランチとタグを復元できる可能性があります。

  1. 生のオブジェクト データがまだ利用可能なリポジトリ。それらgit gcはリポジトリですぐに実行されないため、それはローカル コピーであり、場合によっては GitHubでもあります。オブジェクトはまだ存在している可能性があり、使用する場合は古いプル リクエストによって参照されることさえあります。あなたの GitHub リポジトリのミラー クローンをすぐに作成します。
  2. 古い 'ref' 値 (元のブランチとタグのコミット ID) も必要です。ローカル コピーのreflog、または CI サーバーのログでそれらを見つけることができる場合があります。BFG は変更された参照の古い値と新しい値をコマンド ラインに出力しますが、まだその出力が得られていないと思います。BFG は現在その出力を保存しませんが実行するたびobject-id-map.old-new.txtにディレクトリの下にファイルを保存し、変更されたコミットごとに古い ID と新しい ID を含みます。some-big-repo.bfg-reportBFG が複数回実行されたため、これらのファイルは複数存在します。これらのファイルを使用して現在の参照を調べると、2 つの BFG 実行を遡って、参照の元のコミット ID が何であったかを確認できるはずです。

これらのことを考えると、回復プロセスは次のようになります。

  • --mirror古いオブジェクトがまだ含まれている可能性が最も高いリポジトリのクローンを作成します。
  • 本当にそれらのオブジェクトがあるかどうかをテストします。masterしたがって、 の古い ID が であったことを立証できると仮定すると686b0cd80ac328e060b80dda3c9dadb1e400134a、 を実行しますgit cat-file -p 686b0cd80ac328e060b80dda3c9dadb1e400134a。オブジェクトがまだ存在する場合は、コミットの概要が表示されます。そうでない場合は、他の候補リポジトリのリモートを追加し、そこからデータを取得してみてください
  • git update-refmasterを使用して、ブランチを元のコミットの値に設定します。git update-ref refs/heads/master 686b0cd80ac328e060b80dda3c9dadb1e400134a

関心のある他のすべてのブランチとタグについて繰り返します。これをスクリプト化できることを願っています。頑張ってください!

于 2015-06-30T22:20:54.073 に答える