読者です 読者をやめる 読者になる 読者になる

Gitで、親リポジトリに子リポジトリをヒストリーごと吸収する

やっと仕事でGit始めました。まぁ普段ほとんどIDEから操作してるけど。今日は、
バラバラのリポジトリたちを、ヒストリー保持したまま1ヶ所に集めるときはこうやるよ
のメモ。

Githubさん,ごめんなさい!複数リポジトリを一つにまとめる方法 - Qiita
git リポジトリを歴史も含めて親に取り込んでまとめる | deadwoodをがっつり参考に真似しただけ。


まず、やりたいことのイメージはこんな感じで合っているはず・・・↓

f:id:ihcomega:20150415210715p:plain2つを1つに!親子みたいな関係で。

 

ということで淡々とコマンドを並べます。
なお、コマンドとコマンドの間にちょいちょい出てくる引用部は、
「叩くと大体こんなお返事が返ってくるよ~」という参考です。

環境はCentOS 6.5!ユーザのログインシェルは/bin/bash
ここではGitHub使ってます!別に何でもいいです。
【要読み替え】 SUPER:親リポジトリ名、SUB:子リポジトリ名、
ihcomega56GitHubアカウント名、master:ブランチ名

 

$ 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」とか、ドットで始まるようなファイルを適切に移動するために、
       上記のように記載しているものと理解している。