そう、
r141: ^/trunk を ^/branches/restructure にコピーしました
r142: 変更した ^/branches/restructure
...
r148: 変更した ^/branches/restructure
r149: r142:148 を ^/branches/restructure から ^/trunk にマージしました
つまり、r149 で ^/branches/restructure の r141 を ^/trunk にマージしませんでした。
ご存じのとおり、Git のマージ コミットには、すべての親の全履歴が含まれます。そのため、SubGit は、マージ コミットを作成するときに、必要なすべてのリビジョンが対応するブランチにマージされたかどうかを確認します。
あなたの場合、SubGit は r141 を ^/branches/restructure の履歴のギャップとして検出したため、このブランチをマージの親として commit に追加しませんでした73653d1
。
次のように主張できます。
r141 はファイルやディレクトリの変更を導入していないのに、なぜ SubGit はこのリビジョンを svn:mergeinfo に含める必要があるのでしょうか?
一般的なケースでは、単一の SVN リビジョンがブランチを作成し、その中の任意のファイルを変更することがあります。そのため、SubGit はブランチの履歴のすべてのリビジョンを引き続きチェックします。
ただし、SubGit は少し賢く、ブランチを作成するリビジョンがその中のファイルを変更するかどうかをチェックする可能性があるため、SubGit はマージコミットを自動的に作成します。将来的に実装する可能性があります。これが私たちのトラッカーの問題です。
Git で履歴を修正するには?
Subversion は既存の履歴の変更を許可しないため、欠落している r141 を ^/trunk の svn:mergeinfo プロパティに追加する新しいリビジョンを作成する必要があります。そのために次のことを検討してください。
$ svn switch ^/trunk .
$ svn merge --record-only ^/branches/restructure@148 .
$ svn commit -m 'Merged r141 of restructure changes into the trunk'
Subversion と Git リポジトリの同期を維持すると、SubGit はこのリビジョンを自動的にマージ コミットに変換します。それ以外の場合は、履歴を最初から変換するか、SubGit を同じ SVN リポジトリにもう一度インストールするだけです。
更新:
SVN 同期が不要になった場合、Git リポジトリの履歴を修正するにはどうすればよいですか?
73653d1
次のコマンドを使用して、コミットから始まる Git 履歴の一部を書き換えることができます。
git filter-branch --parent-filter \
'test $GIT_COMMIT = 73653d1 && echo "-p 2ec9e8c -p 5c237f9" || cat' master
注意: 省略された , の代わりに完全なコミット ID を入れ73653d1
て2ec9e8c
ください5c237f9
。
このコマンドは、5c237f9
コミットするマージの親として commit を追加する必要があり73653d1
ます。
それが役立つことを願っています。