閉じる

gitリポジトリをまたぐディレクトリの移動

まぁ 特定リポジトリ内のディレクトリを別リポジトリへ移動したいというケース。(共通コードを別リポジトリのライブラリへまとめたい)
履歴を気にしないのであれば単純なコピーで良いのだけど、gitを使っている以上は活かしたい。
なので、履歴を生かしたままコピーを行い、もとは削除という形で移動。

単純に特定リポジトリ内のディレクトリを別リポジトリへ移動したいというケース。

# 移動元のリポジトリをクローンしてディレクトリ構造を整形
cd /tmp
rm -rf temp_cms5_lib
git clone git@github.com:cic-asahina/riken-cms.git temp_cms5_lib
cd temp_cms5_lib
# cms5_lib以外のファイルを消し、cms5_lib以下のファイルがtemp_cms5_lib以下に展開される。
git filter-branch -f --subdirectory-filter src/server/cms5_lib/ -- --all
# 移動後のディレクトリ構造合わせる
git filter-branch -f --tree-filter "mkdir -p include/cms5_lib/ && git mv -k * include/cms5_lib/"

cd /tmp
rm -rf cms_lib
git clone git@github.com:cic-asahina/cms_lib.git cms_lib
cd cms_lib
git remote add work1 file:///tmp/temp_cms5_lib/
git remote -v
# origin  git@github.com:cic-asahina/cms_lib.git (fetch)
# origin  git@github.com:cic-asahina/cms_lib.git (push)
# work1   file:///tmp/temp_cms5_lib/ (fetch)
# work1   file:///tmp/temp_cms5_lib/ (push)
# work1を取り込む
git fetch work1
git merge --allow-unrelated-histories work1/main
# pushする
git push

# 後始末
cd /tmp
rm -rf temp_cms5_lib
rm -rf cms_lib

元リポジトリの複数ディレクトリを切り出し、別リポジトリへ移動したいというケース。

# 移動元のリポジトリをクローンしてディレクトリ構造を整形
cd /tmp
rm -rf temp_riken-ems_remove_mutex
git clone git@github.com:cic-asahina/riken-ems.git temp_riken-ems_remove_mutex
cd temp_riken-ems_remove_mutex
# remove_mutex以外のファイルを消し、remove_mutex以下のファイルがtemp_riken-ems_remove_mutex以下に展開される。
git filter-branch -f --subdirectory-filter src/server/remove_mutex/ -- --all
# 移動後のディレクトリ構造合わせる
git filter-branch -f --tree-filter "mkdir -p remove_mutex/ && git mv -k * remove_mutex/"

# 移動元のリポジトリをクローンしてディレクトリ構造を整形
cd /tmp
rm -rf temp_riken-ems_wait_for_reload
git clone git@github.com:cic-asahina/riken-ems.git temp_riken-ems_wait_for_reload
cd temp_riken-ems_wait_for_reload
# wait_for_reload以外のファイルを消し、wait_for_reload以下のファイルがtemp_riken-ems_wait_for_reload以下に展開される。
git filter-branch -f --subdirectory-filter src/server/wait_for_reload/ -- --all
# 移動後のディレクトリ構造合わせる
git filter-branch -f --tree-filter "mkdir -p wait_for_reload/ && git mv -k * wait_for_reload/"

cd /tmp
rm -rf web_app_lib
git clone git@github.com:cic-asahina/web_app_lib.git web_app_lib
cd web_app_lib
git remote add work1 file:///tmp/temp_riken-ems_remove_mutex/
git remote add work2 file:///tmp/temp_riken-ems_wait_for_reload/
git remote -v
# origin  git@github.com:cic-asahina/web_app_lib.git (fetch)
# origin  git@github.com:cic-asahina/web_app_lib.git (push)
# work1   file:///tmp/temp_riken-ems_remove_mutex/ (fetch)
# work1   file:///tmp/temp_riken-ems_remove_mutex/ (push)
# work2   file:///tmp/temp_riken-ems_wait_for_reload (fetch)
# work2   file:///tmp/temp_riken-ems_wait_for_reload (push)git checkout -b main
# work1/work2を取り込む
git fetch work1
git merge --allow-unrelated-histories work1/main
git fetch work2
git merge --allow-unrelated-histories work2/main
# pushする
git push

# 後始末
cd /tmp
rm -rf temp_riken-ems_remove_mutex
rm -rf temp_riken-ems_wait_for_reload
rm -rf web_app_lib

FYI: https://qiita.com/yasano/items/f9248eb99850a872b0a8
デフォルトが masterから mainに変わっている

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)