Gitで、親リポジトリに子リポジトリをヒストリーごと吸収する
やっと仕事でGit始めました。まぁ普段ほとんどIDEから操作してるけど。今日は、
バラバラのリポジトリたちを、ヒストリー保持したまま1ヶ所に集めるときはこうやるよ
のメモ。
Githubさん,ごめんなさい!複数リポジトリを一つにまとめる方法 - Qiitaと
git リポジトリを歴史も含めて親に取り込んでまとめる | deadwoodをがっつり参考に真似しただけ。
まず、やりたいことのイメージはこんな感じで合っているはず・・・↓
2つを1つに!親子みたいな関係で。
ということで淡々とコマンドを並べます。
なお、コマンドとコマンドの間にちょいちょい出てくる引用部は、
「叩くと大体こんなお返事が返ってくるよ~」という参考です。
環境はCentOS 6.5!ユーザのログインシェルは/bin/bash! |
$ git clone https://github.com/ihcomega56/SUPER.git
Cloning into 'SUPER'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 33% (1/3) Unpacking objects: 66% (2/3) Unpacking objects: 100% (3/3) Unpacking objects: 100% (3/3), done.
Checking connectivity... done.
$ git clone https://github.com/ihcomega56/SUB.git
Cloning into 'SUB'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 33% (1/3) Unpacking objects: 66% (2/3) Unpacking objects: 100% (3/3) Unpacking objects: 100% (3/3), done.
Checking connectivity... done.
$ cd SUPER/
$ git remote add SUB https://github.com/ihcomega56/SUB.git
$ git remote -v
SUB https://github.com/ihcomega56/SUB.git (fetch)
SUB https://github.com/ihcomega56/SUB.git (push)
origin https://github.com/ihcomega56/SUPER.git (fetch)
origin https://github.com/ihcomega56/SUPER.git (push)
$ git fetch SUB
$ git checkout -b SUB SUB/master
Branch SUB set up to track remote branch master from SUB.
Switched to a new branch 'SUB'
$ git branch -a
!* SUB
master
remotes/SUB/master
remotes/origin/HEAD -> origin/master
remotes/origin/master
$ git filter-branch -f --tree-filter "mkdir SUB && bash -c 'git mv -k {,.[!.],..[!.]}* SUB/'"
Rewrite abcdefghijklmnopqrstekitou12345 (1/1)
Ref 'refs/heads/SUB' was rewritten
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git merge SUB
---エディタでコミットコメント入力、という操作をはさむ---
Merge made by the 'recursive' strategy.
SUB/README.md | 2 +
1 file changed, 2 insertions()
create mode 100644 SUB/README.md
$ git push origin master
---対話式にGitHubユーザ名・パスワード入力、という操作をはさむ---
Counting objects: 7, done.
Compressing objects: 33% (1/3) Compressing objects: 66% (2/3) Compressing objects: 100% (3/3) Compressing objects: 100% (3/3), done.
Writing objects: 16% (1/6) Writing objects: 33% (2/6) Writing objects: 50% (3/6) Writing objects: 66% (4/6) Writing objects: 83% (5/6) Writing objects: 100% (6/6) Writing objects: 100% (6/6), 522 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/ihcomega56/SUPER.git
fe2b037..57b909d master -> master
簡単な解説
- filter-branchオプション:ヒストリーを一括書き換えする
- tree-filterオプション:引数として指定したコマンドを実行し、再コミットする
:ここでは、ヒストリーを一番上のディレクトリから再帰的に移動しているのだと思う。
理解に苦しんだところ
:ファイル名の指定、*
じゃだめなのか?と思ったけど、
「.git」とか、ドットで始まるようなファイルを適切に移動するために、
上記のように記載しているものと理解している。