今回の記事は技術的には特に難しい話はなく、Gitのちょっとした応用なもので本職のエンジニアの人たちの間ではもしかしたら常識なのかもしれませんが、自分にとっては革新的だったので紹介しておきます。
プロジェクトのコードやファイルを管理するためにGitは普通に使っていると思いますが、何か大きなプロジェクトではなくて、端末(Macを想定)内の各ディレクトリに散っているファイルを個別にバージョン管理したくなることってないですか。
例えば、ホームディレクトリにある.vimrcなど.(ドット)始まりの隠しファイルとか、自分がよく使うコードをまとめた自作モジュールとか、頻繁に書くSQLの部品をまとめたメモとか、Pythonの環境構築に使う、requirements.txtなどもそうですね。
このファイルはGitで管理したいけど、それぞれの配置場所を個別にリポジトリにするのは面倒だし、同じディレクトリ内にGit管理が適さない属性のファイルもたくさんあるなぁ、っていう状況です。
このように、配置場所が散らばったファイルを1個のリポジトリで管理する方法があることを最近知りました。
やり方は簡単で、どこかに一つだけリポジトリを作り、その配下に各所に散らばっているファイルを集めてそれをgit管理し、元のフォルダにはシンボリックリンクを貼ると良いです。
まぁ、普通にディレクトリをどこかに掘って、リポジトリを作ります。
最初のコミットは空コミットにしておきましょう。
% mkdir my_files
% cd my_files
% git init
% git commit -m "first commit" --allow-empty
そして、このディレクトリへgit管理したいファイルたちを集めて、元ディレクトリへシンボリックリンク貼ってきます。
参考: ハードリンクとシンボリックリンク
% mv {元のファイルパス} {リポジトリ内のファイルパス}
% ln -s {リポジトリ内のファイルパス} {元のファイルパス}
どのファイルをどこにリンクしているかは、それはそれでREADME.md ファイルかどこかに一緒に記録しておくと良いでしょう。
ちなみに、リポジトリのルート直下に全ファイルまとめておくのはお勧めしません。dotファイルのディレクトリとかPythonモジュールのディレクトリとか切ってリポジトリ内を適切に整理しましょう。
こうすると、一つのリポジトリに各所に置いてあったファイルの実体が集まるのでgitでまとめて管理できるようになります。
そして本来の配置場所にはシンボリックリンクが貼られているので今までと全く同じように使用することができます。
注意点としては、ドットファイルの中でも特にセキュアな認証情報などを環境変数に設定するファイルを管理する場合の流出リスクですね。セキュアな情報はこの管理の対象外にするか、対象にするのであればgithub等外部のリポジトリへは上げない方が良いでしょう。(誤って公開リポジトリに上げてしまうと大事故に繋がり得ます)