2012-01-31 25 views
7

仕事では、非常に巨大なgitリポジトリ(90Go)に対処する必要があります。 ローカルコピーでいくつか修正しようとしたところ(パックファイルにエラーがあり、アンパックしようとしました)、いくつかのオブジェクトファイルが削除されている可能性があります。例えば :Git:リモートから特定のオブジェクトを取得する

> git gc

error: Could not read af9ed8[:snip:]

fatal: bad tree object af9ed8[:snip:]

error: failed to run repack

は、どのように私は、リモートリポジトリから(ハッシュaf9ed8とその場合の1 ...)特定のオブジェクトを取得することができますか?

+1

これはあなたの質問には答えませんが、あなたはそのレポを分割することを提案することを検討するかもしれません!今はそれが大きければ、それはもっと大きくなり、うわー、それはクローンに長い時間がかかるに違いありません。 – Cascabel

+0

'git fetch origin'を実行するとどうなりますか?あまりにも多くのオブジェクトを取得しようとしていますか? – Cascabel

+0

@Jefromiそれは基本的にunclonableです^^。この手続きは、原則的に原本のコピーです。私はそれを分割することが大好きですが、それは仕事の地獄であり、チーム全体を麻痺させ、それは担当者がやることではありません。私はそれに責任がありません(私はちょっと新しい...)。彼らはちょうどそれに対処するために使用されています:一口: –

答えて

4

あなたはこのオブジェクトを含むリモートまたは任意の他の完全なリポジトリへのファイルシステムへのアクセスを持っている場合は、あなたがそこに行くと実行することができます。これだけへの読み取り専用アクセスを必要とすることに

git cat-file tree af9ed8 > 9ed8... 

注意をレポ(あなたは他の場所にファイルを書くことができる)ので非常に安全でなければならず、ファイルシステムへの書き込み権限を持たないユーザとしても行うことができます。その後、/あなたのレポ内の適切な場所にコピーし転送することができます:

cp path/to/9ed8... .git/objects/af/9ed8... 

ルースオブジェクトはハッシュの最初の2桁とのディレクトリに格納されています。ファイル名はハッシュの残りの部分です。

編集:オブジェクトがリモートエンドに緩んでいる場合、あなたはまた、単に直接.git/objectsからそれをコピーすることができますが、それがパックだ場合、あなたはgit unpack-objectsでそれを解凍する必要があるだろう、と私はそのレポでpackfilesを想像しています非常に大きい。これを行うには、パックファイルを破損したリポジトリにコピーし、破損したオブジェクトを削除してから、すでに存在するオブジェクトをアンパックしないでgit unpack-objects < packfileを使用するのが一番良い方法です。

通常のリモートコマンドを使用して行う方法がわかりません。下位レベルのgit fetch-packでも依然としてrefレベルで動作し、refを完了するために必要なコミットでパックを取得します。私はあなたがそのツリーを参照するコミットオブジェクトをすべて削除するような、なんらかの卑劣なことをする可能性があると考えています(git fsck)。私は本当にあなたがそのオブジェクトを指し示すタグを作成し、それをリモートにプッシュし、リモートからタグを取得しようと試みるかもしれないことを期待していましたが(オブジェクトをフェッチすることにそれを凝縮します)、Gitは存在しないオブジェクトを指すタグを作成または操作できるようにします。

+0

私は、私のローカルリポジトリのオブジェクトaf9ed8 ...が壊れていることを再度剪定しようとします。 –

+0

プルーン?あなたは 'git gc'を意味しますか?おそらく 'git fsck'で始めるべきでしょう。そして、それはあなたが別のレポから無傷のものをコピーした後、オブジェクトが壊れていると言いますか? (私は 'git gc'をこの大きなリポジトリで実行したいとは思っていませんが、それは1時間ほどかかるでしょう。) – Cascabel

+0

まあ、gc gcは私に同じ答えを与えます。私は私があきらめていると思う... –

関連する問題