これは状況です:
既存のオープンソースgitリポジトリ(source-repoなど)に基づいて「プライベート」リポジトリ(たとえばour-repo)を作成しました。
私たちはコードを開発しており、リポジトリに約20のマージがあります。そのため、リポジトリは「State_Initial」から「State_Current」に移動しました。
今、ビジネス上の理由から、すべての開発をサードパーティに引き渡したいと考えています。いくつかの法的問題に基づいて、唯一のオプションは、すべての変更を含む「単一」のパッチファイルを提供することです。これは、「State_Initial」と「State_Current」の間のつぶれたパッチです。
周りを見回して見つけた
git format-patch -X
ただし、「n」個の.patchファイルが生成されます。
単一のパッチファイルを作成する方法はありますか?したがって、「source-repo」に基づいてレポを作成し、パッチを適用すると、「State_Current」に移動しますか?
次のコマンドは、複数のコミットを含む単一の.patch
ファイルを作成します。
git format-patch cc1dde0dd^..6de6d4b06 --stdout > foo.patch
その後、次のように適用できます。
git am foo.patch
注:最初のコミットSHAを含める場合は、^..
ではなく..
を使用してください。
単一の squashed commit を持つsquashed
という名前の新しいブランチを作成します。このブランチの内容は通常のブランチとまったく同じですが、履歴はありません。
よく見て、満足したらformat-patch
パッチファイルを作成します。
$ git checkout -b squashed $(git commit-tree HEAD^{tree} -m 'Squashed history')
$ git format-patch --root HEAD
これは非破壊的な操作であり、後で通常の開発ブランチに戻すことができます。 squashedブランチをtag
して、電子メールで送信したものへの参照を保存するか、branch -D
不要になったら削除します。
$ git branch -D squashed
何らかの理由で使い捨てブランチを作成し、state_initial
とstate_current
の間ですべてのコミットを押しつぶしたくない場合は、代わりにgit format-patch
を使用します。 state_initialから分岐し、分岐がソース分岐の上にリベースする場合:
git format-patch source_branch <patch_file_name>
git am <patch_file_name>
を実行すると、コミットチェーン全体が再構築されません。ただし、このパッチファイルは変更の順次リストになります。複数のコミットにまたがって変更したり元に戻したりした場合でも、誰かがパッチファイルを調べれば、それが表示される可能性があります。