16

(を使用して) Bazaar リポジトリを Git にインポートしましたgit bzrが、結果のリポジトリには偽のコミットの親リンクが含まれています。

偽の親リンク

タグ付けされたコミットはコミットに1.02-6基づいていますが、不必要に親としてもマークされていることに注意してください。(注: リポジトリのこの部分のすべてのコミットはタグ付けされています。示されているものの間にコミットはありません。)1.02-31.02-1

いくつかの方法でリベースを試みました (masterブランチ: git rebase 1.02-3、、、 ) がgit rebase -i upstream-1.02、いずれgit rebase --onto 1.02-1 1.02-3git rebase --root upstream-1.02 --onto=other_branch場合もマージの競合で失敗します。これらは必要以上に試みているようです。タグ付けされたコミットに余分な親ポインターが記録されていることを除いて、履歴は正しい1.02-6です。

履歴を線形化するためにリンクを削除するにはどうすればよいですか? すべてのコミットを順番に手動で選択するよりも良い方法はありますか?

4

4 に答える 4

20

これを行う最も簡単な方法 (git >= 1.6.5) は、次を使用することです。

git replace --edit <sha>

Parent: 行を削除/追加/変更します。

変更が正しいことを確認したら、コミットを書き直して変更を永続的にすることができます。

git filter-branch --tag-name-filter cat -- --all

場合によっては、関連するコミットのみを書き直して、完全な履歴を書き直さない方がはるかに速いでしょう (コメントでこれについて言及してくれたMichaelに感謝します)。たとえば、現在のブランチのコミットのみを書き換えるには:

git filter-branch --tag-name-filter cat -- <new parent sha>..head

よくわからない場合は を使用してください。--allそうしないと、他のブランチ/タグがまだ一時的な置換オブジェクトを参照している状態になるリスクがあります。

于 2016-05-03T10:14:42.263 に答える
5

git commit-tree内部コマンドを使用して手動で行うことができます。

1.02-6タグ付けされたコミットを編集して、偽の親ポインター (へ) を削除したいと考えています56a2f3b5948ab54c9239c2b384a6ea9eb1f410c4

まず、既存のコミット オブジェクトから情報を読み取ります。

user@host:/path/repo.git$ git cat-file -p 1.02-6 
tree c658aa1ebcf2bf2a607696c7868b875be72fb01f
parent 56a2f3b5948ab54c9239c2b384a6ea9eb1f410c4
parent 4e671bf1d2298729c9e5cfd8229051cfe2c40831
author James Damour (Suvarov454) <suvarov454@users.sourceforge.net> 1146319620 -0400
committer Bazaar Package Importer <james.westby@ubuntu.com> 1146319620 -0400

The "main/" in the Section line of debian/control should be assumed.

を使用してコミット メッセージを抽出しますgit log --format=%B -n 1 1.02-6

同じ内容で新しいコミットを作成します (偽の親リンクとコミッター情報を除く):

git log --format=%B -n 1 1.02-6 | \
    GIT_AUTHOR_NAME="James Damour (Suvarov454)" \
    GIT_AUTHOR_EMAIL="suvarov454@users.sourceforge.net" \
    GIT_AUTHOR_DATE="1146319620 -0400" \
    git commit-tree c658aa1ebcf2bf2a607696c7868b875be72fb01f \
        -p 4e671bf1d2298729c9e5cfd8229051cfe2c40831

これにより、新しいコミットが作成され、そのハッシュ ( cc32e66...) が出力されました。それを新しいブランチに変えます:

git checkout -b fixed_commit cc32e66

master新しいブランチにリベースします。

git checkout master
git rebase fixed_commit

これで完了です。

終了した

古いブランチを削除し、適切なコミットにタグを付け直すことをお勧めします。


むしろ使いやすいかもgit filter-branch --parent-filter。私はそれを試していません。

于 2013-01-11T23:26:38.497 に答える
1

rebaseを試すことができます。あなたのケースに似ていると思う少し下の例(--ontoを検索)があります。

私はあなたがする必要があると思います

git rebase --onto 1.02-1 1.02-3

1.02-3 以降のすべてを 1.02-1 に配置する必要があり、おそらくそれが必要です。

ハッシュは最初に変更されたコミットとはすべて異なることを覚えておいてください。しかし、bzr からの移行の最初のステップとしてこれを行っていると想定しているため、他の誰もまだこれを複製していないはずです。

于 2013-01-09T20:06:30.787 に答える