前置き
表題の件のようなことをやりたくて調べるとgit filter-branch
を使用する例が良く出てきますが、今はサードパーティのgit filter-repo
の使用が推奨されています。
git filter-repo
を使って「リポジトリーのファイルとコミット履歴をディレクトリ階層を変えつつ別のリポジトリーに移動」した際の手順をまとめました。
1. git filter-repo コマンドを使えるようにする
1-1. scoop のインストール
python
とgit filter-repo
をScoop
でインストールするため、まずScoop
をインストールします。
PowerShell を実行するだけです。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex
1-2. python のインストール
コマンドプロンプトで以下コマンドを実行します。
scoop install python
1-3. git-filter-repo のインストール
コマンドプロンプトで以下コマンドを実行します。
scoop install git-filter-repo
1-4. PCを再起動する
python のパスが通っておらずgit filter-repo
が見つからない可能性が大なので、一旦PCを再起動します。
2. コミット履歴を移動したいリポジトリーの --no-local リポジトリーを作成する
普通に clone したリポジトリーでgit filter-repo
でコマンドを実行すると以下のように警告が表示されます。
Aborting: Refusing to destructively overwrite repo history since
this does not look like a fresh clone.
(expected freshly packed repo)
Note: when cloning local repositories, you need to pass
--no-local to git clone to avoid this issue.
Please operate on a fresh clone instead. If you want to proceed
anyway, use --force.
一旦、以下のようにローカル間で clone したリポジトリーで作業します。
cd temp
git clone https://github.com/old-repo.git
git clone old-repo old-repo-work --no-local
3. git filter-repo の実行
引越し先ではhoge
のファイルはすべてsrc
ディレクトリ配下に移動することにします。
以下のコマンドを実行します。
cd old-repo-work
git filter-repo --to-subdirectory-filter src
4. 引越し先のリポジトリーでファイルとコミット履歴を取り込む
4-1. 引越し先のリポジトリーで old-repo-work リポジトリーをリモートリポジトリとして追加する
cd ..\new-repo
git remote add old-repo-work ..\old-repo-work
4-2. 引越し先のリポジトリーで old-repo-work をマージする
--allow-unrelated-histories
を付与することで履歴を共有していないコミット履歴を取り込む事ができるようになります。
git fetch old-repo-work
git merge old-repo-work/main --allow-unrelated-histories