[Git] git リポジトリを歴史も含めて親に取り込んでまとめる
memo.
こちらを拝見して、どうなるのか試したメモ。
複数のリポジトリがあった時に、それをまとめた親レポジトリを作り、各レポジトリをサブディレクトリとしてまとめてしまう方法。
ファイルとして保存するだけじゃなく、ちゃんとコミットHistoryも保存される。一つにまとめたものを後で切り出すこともできる。
以前書いた Gist を親リポジトリに持ってきてみることにします。
親にしたいリポジトリを作成する
ここでは既にあるので移動します。
% cd VMs/
別ブランチにもってくる
Gist という名前で、親リポジトリにまとめたい gist を remote 登録。
% git remote add Gist https://gist.github.com/6694891.git
% git remote -v
Gist https://gist.github.com/6694891.git (fetch)
Gist https://gist.github.com/6694891.git (push)
origin git@github.com:DriftwoodJP/VMs.git (fetch)
origin git@github.com:DriftwoodJP/VMs.git (push)
fetch して新しいブランチを作成してます。
% git fetch Gist
warning: no common commits
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 18 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (18/18), done.
From https://gist.github.com/6694891
* [new branch] master -> Gist/master
% git checkout -b Gist Gist/master
Branch Gist set up to track remote branch master from Gist.
Switched to a new branch 'Gist'
% git branch -a
* Gist
master
remotes/Gist/master
remotes/origin/master
git filter-branch
ここがマジックだった。
% git filter-branch -f --tree-filter "mkdir Gist && git mv -k {,.[\!.],..[\!.]}* Gist/"
Rewrite 7e0a09da27c3e6ce563ee5bc7e2b360e0b765101 (6/6)
Ref 'refs/heads/Gist' was rewritten
チェックアウトして、例えば master に merge すればよいよう。
% git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
% git merge Gist
Merge made by the 'recursive' strategy.
Gist/Vagrantfile | 13 ++++++++
Gist/provision.sh | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 103 insertions(+)
create mode 100644 Gist/Vagrantfile
create mode 100644 Gist/provision.sh
これで、ファイルだけでなく歴史も親にまとっていました。
以下で一旦戻しました。
% git reset --hard HEAD~
HEAD is now at effb75e typo
理解できていないけれども、ログとして残しておきます。