はじめに
Githubのリポジトリ間でディレクトリを移動することがありました。
基本的に Appendix の記事の踏襲になりますが、コマンドの一部が異なっていたため記録として残しておきます。
手順
例
移動元を REPO.A 、移動先を REPO.B とします。
REPO.A
SOURCE1/FILEA
SOURCE2/FILEB
SOURCE3/FILEC
REPO.B
FOLDER/SOURCE2/FILEB
REPO.A にある SOURCE2 ディレクトリと、その配下の FILEB を REPO.B の FOLDER 配下に移動したい場合の手順を記載します。
SOURCE2 ディレクトリ配下のコミット履歴はそのまま移動させます。
手順
移動元のリポジトリでの移動準備
- REPO.A を clone
cd tmp
git clone https://github.com/REPO.A.git REPO.A.tmp.1
cd REPO.A.tmp.1
-
filter-branch
を使用して対象のディレクトリ絞り込み、コミット履歴を書き換える
git filter-branch -f --subdirectory-filter SOURCE2/ -- --all
git filter-branch -f --tree-filter "mkdir SOURCE2 && git mv -k * SOURCE2/"
git filter-branch -f --tree-filter "mkdir FOLDER && git mv -k * FOLDER/"
移動先のリポジトリでの取り込み作業
- REPO.B を clone
git clone git clone https://github.com/REPO.B.git
cd REPO.B
git checkout -b moverepo
- filter-branch した REPO.A を remote add する
git remote add work /tmp/REPO.A.tmp.1/.git
git remote -v # 確認
- filter-branch した REPO.A を merge する
git fetch work
# --allow-unrelated-histories を付与しないと refusing to merge unrelated histories となる場合がある
git merge --allow-unrelated-histories work/filter
- 必要に応じて push
git push --set-upstream origin moverepo
移動元のリポジトリで移動したディレクトリを削除する
- 必要に応じて
git rm
など
履歴は残したほうがいいと思い、素直にgit rm
git checkout -b delete/hoge
git rm -r <TARGET_DIRECTORY>
Appendix
gitレポジトリ内のディレクトリを別のgitレポジトリ以下に移動する
Gitリポジトリ内にあるディレクトリを別リポジトリに移行する
[Git] fatal: refusing to merge unrelated historiesを解決する話