
破損していないgitリポジトリがあります(すべてのオブジェクトファイルが保存されコミットされる可能性がありますなど)。
最近、「コミットエラー」によっていくつかの古いコミットが中断されたことがわかりました。
git fsck - 完了 オブジェクト ディレクトリの確認: 100%(256/256)、完了しました。 コミットエラー1e04e033e642f9310bd7b0e6745f3ef775a15f15:間違った著者/コミッタ行 - 間違ったメール
個々のコミットを見ました。
zpipe -d <.git/objects/1e/04e033e642f9310bd7b0e6745f3ef775a15f15 276tree 591e98a0b53880a22f18f5bedefe133166d3e67d送信 トップ4c33ebce11897dd52528defa41890eabc59135e3 著者マーティン・リンド<[Eメール保護] >1382869510+0100 マーティン・リンドが提出した<[Eメール保護] >1382869510+0100 メッセージを送信
ここに示すように、電子メールには末尾の改行文字(0x0a、xxdでパイピングして表示)があります。
オブジェクトヘッダを変更できますか?
答え1
作業を始める前に、ローカルストレージをバックアップしてください。
壊れたコミットがあるとします<corrupted>
。
まず、破損したコミットオブジェクトに基づいて新しいコミットオブジェクトを作成します。
git commit-tree -m "New message line 1" -m "Line 2" <corrupt>^{tree} -p <corrupt>^1
注:コマンドを調整します(親を追加するには-p、メッセージ行をコミットするには-mなど)。作成者の名前/電子メールなどを処理するには、git-commit-treeのマニュアルページを参照してください。
新しいコミットSHA-1が得られます<fixed>
。
これで、コミットの置き換え(移行)を実行します。
git replace <corrupted> <fixed>
これにより、壊れたコミットを固定コミットに人為的に変更する「移行」が作成されます。
この修正は元に戻すことができます。これを削除したり、git-replace
コマンドで表示したり(マンページを参照)、ディレクトリを表示したりできます.git/refs/replace/
。
永久に作成するには、以下を使用してください。git filter-branch
ただし、変更されたすべての部分は新しいコミットオブジェクト(新しいSHA-1など)で構成されます。。
# HEAD should point to the most recent commit (certainly master)...
git filter-branch <fixed>~1..HEAD
最後に、交換を延期してください(これは記録に永久に残ります)。
git replace -d <corrupted>
これは1つのマスターブランチでうまく機能しますが、アクティブブランチが複数ある場合(<corrupted>の後に作成されます)、次のようにすべてリベースする必要があります。
git rebase --onto <new-root-branch> <old-root-branch> <branch>
どこ:
<new-root-branch>
これで、ブランチを開始する必要があるコミットです(新しいデフォルトSHA-1)。<old-root-branch>
フィルタブランチが呼び出される前にブランチが開始されたコミット。<branch>
リベースするブランチです。
次のログコマンドを使用して、これらのSHA-1を見つけます。
git log --graph --decorate --all --pretty=oneline
すべて(ブランチなど)が正常であることを再確認し、gitリポジトリに接続されているすべての人が何が起こっているのかを正確に理解したら、次のことができます。git push --force
あなたの修正。