19

Ctrl-Cなどによって中断されたり、接続の問題が原因で発生した場合git fetchは、その後git fetchgit pull機能しません。

user@computer:~/code/openttd-git$ git fetch
^C
user@computer:~/code/openttd-git$ git fetch
error: Unable to find 22d90742fc79a9011fb86ee03d8aeea66bc12657 under http://git.openttd.org/openttd/trunk.git
Cannot obtain needed object 22d90742fc79a9011fb86ee03d8aeea66bc12657
error: Fetch failed.

これはリポジトリとは関係ないと思います。この壊れたローカルリポジトリのコピーを新しいローカルリポジトリに作成するために使用git cloneしても、これは修正されません。私がこれまでに知っている唯一の解決策はgit clone、リモートリポジトリ全体(origin/master)を新しいローカルリポジトリに入れることです。しかし、より良い(より速い)解決策はありますか?

2011年2月からの最後のメッセージがあるDebianバグレポートがあります。これは私が持っているのと同じバグですか、それともこれに対する修正または解決策または回避策がすでにありますか?私のgitバージョンは1.7.10です。

4

7 に答える 7

11

次のコマンドを試してください。

git fsck
git gc
于 2012-10-13T07:59:29.003 に答える
7

ローカルリポジトリ*.pack.tempでを見つけます。.git/objects/pack次に.idx、同じベース名のファイルを見つけて、両方を移動します(または削除しますが、後悔するよりも安全である方がよいでしょう)。再実行git fetchすると、機能するはずです(まあ、私にとってはうまくいきました)。

例えば:

% git fetch
error: Unable to find a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1 under https://www.example.com/~someuser/something.git
Cannot obtain needed object a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1
error: fetch failed.

% ls -l .git/objects/pack
total 65872
-rw-r--r-- 1 someuser someuser    64072 Feb 12  2014 pack-2e31e66e67d8596f1193bbbc06c87293900c6e45.idx
-rw-r--r-- 1 someuser someuser    16920 Jul 21  2013 pack-3d76e0bf6c67d71913efc0711d56f04c7f79b95d.idx
-rw-r--r-- 1 someuser someuser    62224 Feb 11  2014 pack-74107fa80989df6619479874d94b5f8ed010fd2f.idx
-rw-r--r-- 1 someuser someuser    96552 Oct 30 22:55 pack-bb75633331ea0e74d4d3cb29f7660e1ba00fb899.idx
-rw-r--r-- 1 someuser someuser    73228 Mar  6  2014 pack-de0c1bcf3550cd7a2fd0c5a981bc17d15f1144c0.idx
-r--r--r-- 1 someuser someuser   129144 Feb  2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.idx
-r--r--r-- 1 someuser someuser 46413554 Feb  2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.pack
-r--r--r-- 1 someuser someuser   129312 Feb  2 19:10 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx
-rw-r--r-- 1 someuser someuser 20450545 Feb  2 19:09 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack
-rw-r--r-- 1 someuser someuser   129312 Feb  2 18:36 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx
-rw-r--r-- 1 someuser someuser  9863168 Feb  2 18:37 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp

% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx /tmp/
% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp /tmp/
% git fetch
From https://www.example.com/~someuser/something
   3288ab9..a4fb0b5  master     -> origin/master
于 2015-02-02T19:00:21.987 に答える
1
man git-fsck

rsyncを使用するように言います:

バックアップや他のアーカイブで見つけなければならない破損したオブジェクト(つまり、他の誰かが破損したオブジェクトを持っていることを期待して、それらを削除し、他のサイトとrsyncを実行できます)。

rsync -av user@host:repo/.git ./.git

私のために働いた

于 2013-03-29T17:29:27.207 に答える
0

Git 2.30(Q1 2021)を使用すると、クリーンアップがより簡単になります。 " git fetch" manが強制終了されると、pack-objectsプロセスが残り、適切な圧縮を見つけるための計算が行われ、サイクルが無駄になる可能性があります。

これは修正されました。

Jeff King()によるcommit 309a402(2020年12月1日)を参照してください。( Junio C Hamanoによってマージされました---コミットf3a112a、2020年12月3日peff
gitster

upload-pack:信号または終了時にpack-objectsヘルパーを強制終了します

サインオフ-作成者:Jeff King

外部のpack-objectsプロセスを生成して、実際にオブジェクトをリモート側に送信します。このプロセス中にシグナルによって強制終了された場合、pack-objectsは実行を継続する可能性があります。パックの出力の生成を開始するとすぐに、upload-packへの書き込みに失敗して終了します。
ただし、その前に、オブジェクトグラフをトラバースしたり、デルタを圧縮したりするなど、重要な作業が行われる可能性があります。これらはすべて無意味です。したがって、発信者が結果を読み取らないことがわかったら、すぐに強制終了するようにしましょう。

本質的に際どいので、ここではテストはありませんが、linux.gitのような大規模なリポジトリで簡単に複製できます。

  • パックビットマップがないことを確認してください(列挙フェーズがすばやく進行するため)。の場合linux.git、私のマシンでグラフ全体を歩くのに約30秒かかります。
  • run " man ;" "は重要です。これは、(サイドバンドを介してクライアントに多重化するために)に進行状況を書き込んでいる場合、stderrへの書き込みの失敗にすぐに気付くためです。git clone --no-local -q . dst-qpack-objectsupload-pack
  • 別のターミナルでクライアント側のクローンプロセスを強制終了します(SIGINTすべてのプロセスに送信されるため、^ Cは使用しないでください)
  • 「」などを実行して、5秒以内に死ぬのps au | grep gitを観察upload-packします(クライアントが消えたことを通知するキープアライブを送信します)
  • ただしpack-objects、トラバーサルおよびデルタ圧縮フェーズでは、100%のCPU(および1GB以上のRAM)を消費します。パックの書き込みを開始するとすぐに終了します(それがなくなったことに気付くとupload-pack)。

このパッチを使用pack-objectsすると、すぐに終了upload-packします。

于 2020-12-05T00:12:20.523 に答える
-1

実行できますか:

git reset --hard <some prior commit>

理論的には、実行したばかりの場合はgit fetch、次のことができるはずです。

git reset --hard HEAD

これにより、フェッチ操作の中断によって生じた変更が破棄され、リポジトリが以前の状態に戻ります。この時点で、操作を再実行できるはずですfetch

于 2012-05-20T10:14:04.457 に答える
-1

リポジトリ破損している可能性があります。サーバー上で実行するgit fsckと、問題が解決する場合があります。git gc別のディレクトリにクローンを作成し、そのディレクトリからプルすると、コミットも実行されます。その後、git fetch参照を更新するだけでオブジェクトをフェッチする必要がないため、aは機能します。

于 2015-01-29T22:36:13.477 に答える
-2

レポを掃除してみましたか?

git gc

上記のコマンドはreflogもクリーンアップするため、注意が必要です。

于 2012-05-21T07:58:07.413 に答える