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プロジェクトを作成しようとしました。最終的に、同じエラーが発生し続けます。
誰が原因が何であるか、またはどのように回復するかについての洞察を持っていますか?
使用する git Push --no-thin
の代わりに git Push
。
Gitドキュメントから:
シン転送は、送信者と受信者が同じオブジェクトの多くを共通に共有する場合、送信されるデータの量を大幅に削減します。デフォルトは--thinです。
Tortiuse gitでも同じエラーが発生します。私はついにこのエラーの根本原因を突き止めました。
このエラーを引き起こす手順。
このエラーは、ローカルブランチが作成され、ヘッドブランチでいくつかの変更が行われるまでプッシュされない場合に発生します。リモートヘッドブランチはプッシュアクションまでローカルブランチについて何も知らないため、これは正常なことです。
このエラーを解決するには、ヘッドブランチを切り替えてフルプルアクションを取得します。次に、ブランチを切り替えてプッシュを試してください。
何かを試す前に、今すぐバックアップしてください。
今、それは残念なことに聞こえます。また、定期的にバックアップする必要があるように聞こえないのも残念です。ただし、良いニュースがあります。開発者はこのファイルを持っているに違いありませんが、パックファイルに含まれている可能性があります。他の誰かの.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 を探索するか、更新コメントを投稿して、これに戻るのを待つこともできます。
これを取得したら、ほとんどの場合、git gcで修正できます。
git gc --aggressive --Prune=now
最初にgitリポジトリをバックアップしてください!
git pull --rebase
。
差分を保存しました(git show > ~/mychanges.txt
、ファイルの先頭でコミットメッセージを取り出しました)。新しいブランチをチェックアウトしました(git checkout -b newbranch
)変更を適用しました(git apply ~/mychanges.txt
)、そしてgit pull --rebase
。その後、すべてが機能しました。
マスターブランチにない場合は、次の方法でリモートブランチを簡単に削除できます。
git Push --delete Origin <branch_name>
そして、ブランチをリモートにプッシュします。
git Push -u Origin <branch_name>
同じ問題がありました。これを解決するためにgit fetchを使用してからもう一度プッシュしましたが、うまくいきました。
Gitのバージョンをアップグレードしてみてください。1.9.0で問題が発生しました。
これは通常、コミットとプッシュの時間が異なる場合に発生し、最終的に両方のツリー間で不一致が発生します。リモートブランチpstreamおよびローカルブランチfoo
最初に、コミットされていない変更をすべて破棄します
git reset --hard foo
次に、次を使用してリモートブランチを追跡します
git branch --set-upstream-to=upstream/foo
そして最後に
git pull
マスターブランチを削除して、もう一度作成しました。その働き。 git branch -D master、git checkout master幸いにも動作します
私の場合、git rebase -i Origin/masterの前にgit fetchを忘れていました。したがって、gerritにプッシュしようとすると、上記のエラーが発生しました。
技術的にはこの回答は少し遅れていますが、私がうまくやったのは、プッシュしようとしているチェンジセットのパッチを作成し、リポジトリを別のディスクの場所に複製し、パッチを適用し、再コミットしてプッシュすることでした。
簡単な解決策は、フェッチ->リベース->コミットしてからプッシュです。