Posted at

Githubさん,ごめんなさい!複数リポジトリを一つにまとめる方法

More than 5 years have passed since last update.

複数のリポジトリがあった時に、それをまとめた親レポジトリを作り、各レポジトリをサブディレクトリとしてまとめてしまう方法。

ファイルとして保存するだけじゃなく、ちゃんとコミットHistoryも保存される。一つにまとめたものを後で切り出すこともできる。

これでリポジトリ数の削減が可能になるので、GithubのPrivateリポジトリ数の上限などにお悩みの人は是非お試しを。現在、頻繁に使っているものをまとめてしまうのはおすすめしないが、古い使われてないものを歴史ごとアーカイブするのには持ってこいだと思う。

以下では、


  • $ACCOUNT = githubのアカウント名

  • $REPO = サブディレクトリに移したいレポジトリ名

  • $ARCHIVE = 複数リポジトリをまとめておくアーカイブ用親リポジトリの名前

とする。


複数リポジトリをまとめたアーカイブ用gitリポジトリをローカルに作成

mkdir $ARCHIVE

cd $ARCHIVE
git init
touch .gitignore README.md # 適当に編集
git add .
git commit -m "Add .gitignore and README.md"

ここで、とりあえず一つ何かCommitしておくのは、失敗してもgit reset --hard HEAD~で戻れたりと何かと都合がいいから。


既存リポジトリをARCHIVEのサブディレクトリとして保存

git remote add $REPO git@github.com:$ACCOUNT/$REPO.git

git fetch $REPO
git checkout -b $REPO $REPO/master
git filter-branch -f --tree-filter "mkdir $REPO && git mv -k {,.[\!.],..[\!.]}* $REPO/"
git checkout master
git merge $REPO

うまくいってそうだったら、github上のREPOリポジトリを消す。

これをまとめたい各リポジトリに対して行う。


参考

http://stackoverflow.com/questions/13337877/what-is-the-opposite-of-git-filter-branch-subdirectory-filter


複数リポジトリをまとめたアーカイブをGithubにPush

Github上にARCHIVEという名前のリポジトリを作成する。

git remote add origin git@github.com:$ACCOUNT/$ARCHIVE.git

git push -u origin master

この順番でやれば、Githubのprivateリポジトリ数の上限に達していても、ちゃんと複数リポジトリをサブディレクトリとしてまとめたアーカイブを作ることができる。


おまけ:もう一度切り出したい時

逆にまとめてしまったものをもう一度切り出したいときは以下のようにする。

git clone git@github.com:$ACCOUNT/$ARCHIVE.git $REPO

cd $REPO
git filter-branch --subdirectory-filter $REPO
git remote add origin git@github.com:$ACCOUNT/$REPO.git
git push -u origin master