web-dev-qa-db-ja.com

「ツリーの欠落」エラーのためにGitリポジトリを回復するにはどうすればよいですか?

GitリポジトリにGerritを使用しています。数か月間アクティブになっているプロジェクトでは、突然変更をプッシュできません。 git Pushを実行すると、次のエラーが表示されます。

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

git fsck --fullを実行すると、次の結果が得られます。

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リポジトリ(git init --bare ...)を再初期化して、プッシュしました。また、別のリポジトリを使用して新しいgerritプロジェクトを作成しようとしました。最終的に、同じエラーが発生し続けます。

誰が原因が何であるか、またはどのように回復するかについての洞察を持っていますか?

28
Justin Guertin

使用する git Push --no-thin の代わりに git Push

Gitドキュメントから:

シン転送は、送信者と受信者が同じオブジェクトの多くを共通に共有する場合、送信されるデータの量を大幅に削減します。デフォルトは--thinです。

39
Filip

Tortiuse gitでも同じエラーが発生します。私はついにこのエラーの根本原因を突き止めました。

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

  • 頭に新しいブランチを作成します。
  • 新しいブランチでいくつかの変更を行う
  • 誰かがヘッドブランチにも変更を加えます
  • ブランチをプッシュしてみてください

このエラーは、ローカルブランチが作成され、ヘッドブランチでいくつかの変更が行われるまでプッシュされない場合に発生します。リモートヘッドブランチはプッシュアクションまでローカルブランチについて何も知らないため、これは正常なことです。

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

15
erencan

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

今、それは残念なことに聞こえます。また、定期的にバックアップする必要があるように聞こえないのも残念です。ただし、良いニュースがあります。開発者はこのファイルを持っているに違いありませんが、パックファイルに含まれている可能性があります。他の誰かの.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 を探索するか、更新コメントを投稿して、これに戻るのを待つこともできます。

8
Jeff Ferland

これを取得したら、ほとんどの場合、git gcで修正できます。

git gc --aggressive --Prune=now

最初にgitリポジトリをバックアップしてください!

7
mtmattek

git pull --rebase

差分を保存しました(git show > ~/mychanges.txt、ファイルの先頭でコミットメッセージを取り出しました)。新しいブランチをチェックアウトしました(git checkout -b newbranch)変更を適用しました(git apply ~/mychanges.txt)、そしてgit pull --rebase。その後、すべてが機能しました。

4
Rose Perrone

マスターブランチにない場合は、次の方法でリモートブランチを簡単に削除できます。

git Push --delete Origin <branch_name>

そして、ブランチをリモートにプッシュします。

git Push -u Origin <branch_name>

同じ問題がありました。これを解決するためにgit fetchを使用してからもう一度プッシュしましたが、うまくいきました。

2
Yassine Younes

Gitのバージョンをアップグレードしてみてください。1.9.0で問題が発生しました。

1
marcbest

これは通常、コミットとプッシュの時間が異なる場合に発生し、最終的に両方のツリー間で不一致が発生します。リモートブランチpstreamおよびローカルブランチfoo

最初に、コミットされていない変更をすべて破棄します

git reset --hard foo

次に、次を使用してリモートブランチを追跡します

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

そして最後に

git pull
1
Shubham Vatsal

マスターブランチを削除して、もう一度作成しました。その働き。 git branch -D master、git checkout master幸いにも動作します

0
Bala

私の場合、git rebase -i Origin/masterの前にgit fetchを忘れていました。したがって、gerritにプッシュしようとすると、上記のエラーが発生しました。

0
John Jiang

技術的にはこの回答は少し遅れていますが、私がうまくやったのは、プッシュしようとしているチェンジセットのパッチを作成し、リポジトリを別のディスクの場所に複製し、パッチを適用し、再コミットしてプッシュすることでした。

0
avgvstvs

簡単な解決策は、フェッチ->リベース->コミットしてからプッシュです。

0
Nagaraju