.dotfilesに.emacs.dを結合する

はじめに

前略

無知な私は.dotfilesと.emacs.dを別々のリポジトリで管理していたので
いい加減に統合したいと思います

早々

いろいろ調べて得られた知見(セオリー)としては
1.別ブランチに移動してコピー
2.masterにマージ
という様にブランチを一手間経由するのが確実で良いようです

1.別ブランチに移動してコピー

Emacsブランチの中身になるリモートリポジトリを登録する.

.dotfilesディレクトリに移動し,emacsリモートリポジトリを新しいリモート先として登録

$ git remote add Emacs git@github.com:hightoro/emacs

確認

$ git remote -v

フェッチして,新しいブランチを作成する

Emacsブランチに中身をぶちまける

$ git fetch Emacs
$ git checkout -b Emacs Emacs/master

これで,ブランチが切り替わり,ディレクトリの中身がemacs.gitのものになります

確認

$ git branch -a

2.masterにマージする

git filter-branchを使用してサブディレクトリ.emacs.dを作成

すこしだけこのコマンドの解説を読みました

git filter-branchはコミット履歴に大幅な改変を加えたいときに使用するコマンドだそうです

gitではコミット履歴は(他のプロジェクトメンバに公開して供するまでの間は)
自由に改変すべきだという思想があるそうです
そのためにgit rebaseや各種オプションが用意されているわけです

そしてこのgit filter-branchはその中でも「複数のコミットに対して,
ある種の改変を行いたい」場合に使用される最終兵器だそうです

今回はgit filter-branch --tree-filterを使用します
git filter-branch --tree-filterはこれまでの既存のコミット履歴に対して,
過去のある時点に何らかの操作を適応し、そこから現在までのコミット履歴を一括して改変するものらしいです

ではこれまでの./で行ったコミットをすべてサブディレクトリ.emacs.d/の中で起こったことにしましょう

$ git filter-branch -f --tree-filter "mkdir .emacs && git mv -k {,.[\!.],..[\!.]}* .emacs.d/"

mkdirした.emacs.dの中にぶちまけた中身をすべて放りこんだ上で,これまでにコミット履歴の一部が改変されます

Emacsブランチをmasterブランチにマージ

最後にEamcsブランチをmasterブランチにマージします

$ git checkout master
$ git merge Eamcs 

これで.emacs.dサブディレクトリにリモートリポジトリが追加され,
コミット履歴にもリモートリポジトリemacsのこれまでのコミット履歴がマージされる

参考:

Git - 歴史の書き換え

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

git リポジトリを歴史も含めて親に取り込んでまとめる | deadwood