💨

Gitで特定のディレクトリをコミット履歴を保持したまま別のリポジトリに移動させたい

2023/11/23に公開

タイトル通りのことをしたくて調べていたところ、git-format-patchという機能で実現できるようでした。

方法

以下のコマンドを移動させたいディレクトリがあるリポジトリで実行します。

git format-patch --root -o "(パッチファイルの出力先ディレクトリパス)" -- "(移動させたいディレクトリのパス)"

上記のコマンドの指定では、ルートコミットから最新のコミットまでのすべてのコミットのうち、移動させたいディレクトリに対する変更を加えたコミットがパッチファイルの生成対象になります。
1コミットごとに1つのパッチファイルが指定した出力先に生成されます。

パッチを適用したい場合は、以下のコマンドを移動先のリポジトリで実行すればよいです。

git am "(パッチファイルの出力先ディレクトリパス)\*"

以上で、特定のディレクトリのみをコミット履歴を保持したまま別のリポジトリに移動できます。

注意点

マージコミットに対応するパッチファイルは作成されないため、パッチファイル適用時にマージが実行されるようです。
競合発生時にマージツールで解消したいファイル(e.g バイナリファイル)がパッチに含まれている場合、

git am --3way "(パッチファイルの出力先ディレクトリパス)\*"

のようにすると3way マージを実行でき、マージツールを起動できるようです。

参考資料

https://kajindowsxp.com/git-format-patch/

https://git-scm.com/docs/git-format-patch

Discussion