Git svn rebaseを実行すると、ある時点で停止し、次のように表示されました。
Index mismatch: SHA key of a tree != SHA key of another tree.
(これらのSHAキーはツリーに対応し、上記の2つのshaキーのgit showからのコミットではないことがわかりました。)
re-reading <sha index of a commit in svn/trunk>
... list of files ...
fatal: bad object <SHA1 index of the bad object>
rev-list -1 <SHA1 index of the bad object> --not <SHA1 index of the revision it was trying to re-read>: command returned error: 128
私はgitの内部動作にあまり経験がないので、これらのような問題を分析し、おそらくそれらを解決するために従うべき一連のステップはありますか?
このエラーは2回発生しましたが、どちらの場合も.gitフォルダー内のsvnフォルダーを削除することで解決しました。
rm -r .git/svn
次に、次のコマンドを使用してsvnメタデータを再構築します。
git svn fetch
次の行に沿ってメッセージが表示される可能性があります。
Migrating from a git-svn v1 layout...
Data from a previous version of git-svn exists, but
.git/svn
(required for this version (1.7.0.4) of git-svn) does not exist.
Done migrating from a git-svn v1 layout
そしてしばらくすると(特に大規模なリポジトリでは再構築に時間がかかる場合があります)、svnリポジトリのミラーが再び機能するようになるはずです。
これを修正するために.git/svnフォルダーを削除しないでください。それはあなたがすべてを再構築することを要求します、それは迷惑です、それはしばらくかかります(私のレポのサイズのために数時間)そしてそれは必要ではありません。
私は正しい答えを見つけました ここ そして私はそれを以下に含めました。
リンクから:
.gitディレクトリ内で以下を実行します。
$ find . -exec grep -Hin 5b32d4ac2e03a566830f30a702523c68dbdf715b {} \;
Binary file ./svn/.caches/lookup_svn_merge.db matches
Binary file ./svn/.caches/check_cherry_pick.db matches
ここで、最初のコマンドの出力から一致する.svn /.cachesを削除します
$ rm ./svn/.caches/lookup_svn_merge.db
$ rm ./svn/.caches/check_cherry_pick.db
今git svn rebase
またはgit svn fetch
心ゆくまで。
Gitクライアントを更新し、以下を使用して最後のsvnコミットを再フェッチします。
git svn reset -r 12345
git svn rebase
ここで、12345は既存のsvnリビジョンです。
私の場合、この問題は、git-svnが使用するように構成されたauthors
ファイルにない新しい/不明なsvn作成者が原因で発生しました。最初の数回の読み取りを無視したことが出力で報告されました。
Index mismatch: <leftsha1> != <rightsha1>
rereading <anothersha1>
... list of files ...
Author: <name> not defined in /path/to/authors file
そのため、不足している名前と、それを追加するファイル(組織のユーザーレジストリから電子メールを取得しました)がわかり、スムーズに航海できました。
この場合、問題はこれを体系的に実行する必要があることです。
何かが足りない、すべてがクラッシュする。私が回復することを知っている唯一の方法は、.gitのすべてのsvnを削除し、すべてを再構築することです。それはただ迷惑で、しばらく時間がかかります!
おそらく、メッセージに同時にチェックサムの不一致がある可能性があります。
私はここで解決策を見つけました Git svn rebase:チェックサムの不一致 :
git svn log <item with checksum mismatch>
git svn reset -r<top history revision in the log> -p
git svn rebase
このエラーが発生しました:
Index mismatch: <sha> != <sha> re-reading <sha index of a commit in svn/trunk> ... list of files ... <path> was not found in commit <sha> (r<svn rev>)
報告されたパスの履歴をSVNリポジトリで調べたところ、ファイルが追加されたSVNリビジョンが見つかりました。しかし、そのリビジョン用に作成されたコミットをGitで見ると、ファイルが含まれていないことがわかりました。
これは以前にディスクがいっぱいになったことが原因だったと思います。壊れたGitコミットのリビジョンにgit svn reset -r
を戻した後、git svn fetch
は再び正常に機能しました。
たぶん、ファイルシステムのコピーオンライト機能(ext4/btrfs/etc ...)と関係がありますか?
私は自分でこのエラーが発生しました。次のように、参照を削除するだけです。
rm .git/refs/remotes/git-svn
これでエラーが解消されるはずです。
最初のクローン作成中にこれに遭遇したのは、誰かがトランクと呼ばれるブランチを作成し、それが実際のトランクと競合していることが判明したためです。/branchs/trunkを無視した後、すべて機能しました