トップ  > svn・git  > git  > 記事

No.2405 githubのリポジトリからgitcloneできない

githubのリポジトリからgit cloneできないAdd Starvoidy21

git cloneがエラーになって実行できない

$ git clone git@github.com:*****/**********.git
Initialized empty Git repository in **********/.git/
Enter passphrase for key '***********/.ssh/id_rsa':
remote: Counting objects: 242   
error: Could not read 9200264547b8d08ded8070aa094dfd725a2cb2d8
fatal: bad tree object 9200264547b8d08ded8070aa094dfd725a2cb2d8
remote: Compressing objects: 100% (278/278), done.
error: waitpid (async) failed
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: Total 295 (delta 104), reused 0 (delta 0) KiB/s
remote: aborting due to possible repository corruption on the remote side.
Receiving objects: 100% (295/295), 4.47 MiB | 270 KiB/s, done.
Resolving deltas: 100% (104/104), done.
fatal: error in sideband demultiplexer

github側の 9200264547b8d08ded8070aa094dfd725a2cb2d8 というツリーが欠損してるみたい(http://github.com/*****/***********/tree/9200264547b8d08ded8070aa094dfd725a2cb2d8 にアクセスできない)


とりあえずの回避策

このままだと、別の環境からソースが引っ張ってこれなくて非常に困る。

tree objectが欠損しているコミットを読み込まなければいいはず。

ということで、これで最新だけ取得すれば回避できます。

git clone --depth 1

リポジトリの破損からの復旧

流石に普及せず放置するわけにもいかないので調べたところ、

似たような事象がサポート内にありました。

bad branch - bad tree object / Repo issues / Discussion Area - GitHub Support

ようは欠落しているオブジェクトをpushしてくれと・・・


まずは欠落しているオブジェクトを特定します。

エラーになってるtreeの情報を表示します。

$ git ls-tree 9200264547b8d08ded8070aa094dfd725a2cb2d8
100644 blob 6df1faca25fccd58bea8641b7a32b4df55ec6249    ***
100644 blob e93747a815b0148ae39c31f6c1d032363c1997b0    ***

このどちらか、あるいは両方が欠落してるオブジェクトです。


次に、ローカル側がこのオブジェクトを持ってるか、エラーチェックをします。

$ git fsck --full

これでローカル側にもオブジェクトがなかったら、マニュアル見ながら復旧する必要があります。

Git ユーザマニュアル (バージョン 1.5.3 以降用)

ちなみに今回は問題なかった


次に、ログよりオブジェクトが含まれるコミットを探します。

$ git log --all --raw

viと同じように、/ で検索できます。

ハッシュの先頭7文字が書かれてるので、そこから抜き出せます。

結果はこんなかんじ

commit 7e92bd050d168fe08fcbb2c43e22d507cc6808a5
Author: *************
Date:   Mon Dec 21 17:36:06 2009 +0900

    Commit message...

:100644 100644 b14d84c... 08c3880... M  **********
:000000 100644 0000000... 6df1fac... A  **********
:100644 100644 b86f702... 95562d5... M  **********


commit 741fc120a20acf827d8eb815c78c693f2203a765
Author: *************
Date:   Tue Dec 22 15:51:16 2009 +0900

    Commit message...

:100644 100644 8329b53... 4f3d5dd... M  **********
:100644 100644 eac91b2... e93747a... M  **********

ハッシュは コミット前 コミット後 という順番で並んでるので、

2つめのハッシュが欲しいオブジェクトハッシュになってるコミットを抜き出します。


後は、ローカルブランチをリセットして調べたコミットのところまで戻って、

githubにプッシュすればよいです。

今回の場合は、

  1. 741fc120a20acf827d8eb815c78c693f2203a765 にリセット
  2. githubに強制上書きでプッシュ
  3. 7e92bd050d168fe08fcbb2c43e22d507cc6808a5 にリセット
  4. githubにプッシュ
  5. 最新コミットにリセット
  6. githubにプッシュ

といった感じで実行しています。


ここまでやったら、git cloneを実行しても大丈夫だった!

復旧完了!!!!!

引用元

更新:2010/05/04 16:36 カテゴリ: svn・git  > git ▲トップ

Python

フロントエンド開発

Linux

web開発

サーバ管理

GCP

svn・git

ソース・開発

プロマネ

HTML・CSS

JavaScript

Alexa

Docker

webサービス運用

webサービス

Mac

MySQL

PHP

FuelPHP

ツール, ライブラリ

ビジネス

テンプレート

プレゼン

マネタイズ

負荷・チューニング

Windows

メール

メール・手紙文例

CodeIgniter

オブジェクト指向

UI・フロントエンド

cloud

マークアップ・テキスト

Flash

デザイン

DBその他

Ruby

PostgreSQL

ユーティリティ・ソフト

Firefox

ハードウェア

Google

symfony

OpenPNE全般

OpenPNE2

Hack(賢コツ)

OpenPNE3

リンク

個人開発

その他

未確認

KVS

ubuntu

Android

負荷試験

オープンソース

社会

便利ツール

マネー

Twig

食品宅配

WEB設計

オーディオ

一般常識

アプリ開発

サイトマップ

うずら技術ブログ

たませんSNS

rss2.0