[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

理解できていないけれども、ログとして残しておきます。