2011-08-29 7 views
23

GitリポジトリにGerritを使用しています。数ヶ月間アクティブだったプロジェクトでは、突然変更をプッシュできません。 git fsck --full利回り実行Gitリポジトリを "ツリーの欠落"エラーで回復するにはどうしたらいいですか?

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

::私たちはgit pushを実行すると、私たちは、次のエラーが表示さ

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a 
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27 
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff 
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2 
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f 
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df 
dangling tree 5377d7f7111d340854c3ee0946667c202227e603 
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1 
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819 
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94 
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d 

を、彼らがプッシュしようとするとき、私たちの開発者のすべてが、同じエラーが発生しています。これまでは、gerritのrepo(git init --bare ...)を再初期化し、それを上げようとしました。別のレポを持つ新しいgerritプロジェクトの作成も試みました。結局、私たちは同じエラーが発生し続けます。

誰に原因があるのか​​、どのように回復するのかについての洞察はありますか?

答えて

7

バックアップしてください...何かを試す前に、これをバックアップしてください。

これは残念です。定期的なバックアップを取っているようには聞こえないというのは残念です。しかし良いニュースがあります:あなたの開発者がこのファイルを持っていると確信していますが、パックファイルに入っているかもしれません。他の人の.gitディレクトリで次の行を試してみてください。 gitは、ディレクトリ名にハッシュの最初の2文字を使用することに注意してください。

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9 

それが現れた場合は、サーバー上の同じ相対パスにそのファイルをコピーして、人生がうまくに移動する必要があります。 (あなたはすぐにスクリプトにこれをすることができますか、それは手動で行う)

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9 

はそれはそれはファイルのパックをお見せしませんが、それはそのそこにあなたを教えてくれます:いない場合は、これを試してみてください。正しいパックファイルを見つけて展開してください。

git unpack-objects $FILE 

そこから、サーバー上の同じ相対パスにファイルをコピーします。それで解決できない場合は、さらなる作業が必要です。開発者の最新の十分なリポジトリを交換すると、問題が修正される可能性があります。また、https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3Fを探索したり、更新コメントを投稿したり、これをやり直すのを待つこともできます。

+0

情報をありがとう、それは私をかなり助けてくれました。私は正しいidxファイルを見つけることができましたが、パックファイルを解凍しても何も回復しませんでした。私たちの他の開発者も同じ話だった。結局、私は時間がなくなったので、新しいレポを初期化し、古いものを歴史の周りに残すことによって、問題を処理しました。 –

+0

ツリーエラーのために特定のブランチをプッシュできないという同様の問題があります。不足しているオブジェクトを見つけてリモートリポジトリにコピーしましたが、問題は解決しません。すべての手がかりは? –

3

git pull --rebaseを試してください。

私はdiff(git show > ~/mychanges.txt、ファイルの先頭にコミットメッセージを取り出しました)を保存しました。チェックアウトされた新しいブランチ(git checkout -b newbranch)は、変更(git apply ~/mychanges.txt)を適用してからgit pull --rebaseを実行しました。それからすべてがうまくいった。

+1

私の一日を保存してくれてありがとう! – simonso

0

技術的にはこの回答は少し遅いですが、私がやりたいチェンジセット用のパッチを作成し、別のディスクの場所にリポジトリを再クローンし、パッチを適用し、再起動してプッシュしました。

0

クイックソリューションは フェッチ - > ベースベース> コミットしてからプッシュします。

3

マスターブランチに、あなたは単純にして、リモートブランチを削除することができない場合は、次の

git push --delete origin <branch_name> 

そしてリモートに戻ってあなたのブランチをプッシュ:

git push -u origin <branch_name> 
11

私はこの同じエラーにを取得しています私の不法行為git。私はついにこのエラーの根本的な原因を得ました。

このエラーを引き起こす手順。

  • 先頭に新しい分岐を作成します。
  • 誰かがまた頭支店
  • に変更を加える新しいbranchsにいくつかの変更を行いますローカルブランチが作成され、いくつかの変更のアラまで押されていない場合、このエラーが発生します

あなたのブランチをプッシュしよう頭の枝で作られた。リモートヘッドブランチは、プッシュアクションまでローカルブランチについて何も知らないので、これは正常なことです。

このエラーを解決するには、ヘッドブランチを切り替えて完全なプルアクションを取得します。次に、ブランチを切り替えてプッシュを試してください。

+0

これはまったく明らかではない原因です。このソリューションは私のために働いた! –

29

git pushの代わりにgit push --no-thinを使用してください。 Gitのドキュメントから

A thin transfer significantly reduces the amount of sent data when the sender and receiver share many of the same objects in common. The default is --thin.

+3

ブランチが多くのコミットによって先行している場合は、このオプションを使用できます。それはうまく動作します! – Riverside

1

はgitののバージョンをアップグレードしてください、私たちはこれを取得すると、私はほとんどいつものgit GCでそれを修正することができます1.9.0

3

の問題を見た:

git gc --aggressive --prune=now 

最初にgit repoをバックアップしてください!

1

これは、通常、コミットとプッシュの時間が異なり、最終的に両方のツリーの間に不一致が生じるときに発生します。次に、使用してリモートブランチを追跡

git reset --hard foo 

を使用して

はまず捨てコミットされていないすべての変更をリモートブランチ上流とローカルブランチFOOを考えると

git branch --set-upstream-to=upstream/foo 

そして最後に

git pull 
関連する問題