【FreeBSD】個人用設定ファイル(dotfiles)の管理方法について

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.0-RELEASE-p5

課題

巷では、.shrc.vimrcなどの個人用設定ファイルのことを、「dotfiles」と呼んでいる。

「dotfiles」は、より使いやすい環境にするために、お試しで修正することがよくある。
お試しなので、修正前の状態にいつでも戻せるようにしておきたい。

どうやって管理すればいいだろうか。

対策

巷では、下記のような管理方法がメジャーなようだ。

  1. 「dotfiles」を1つの管理ディレクトリにまとめる
  2. 管理ディレクトリ配下の「dotfiles」へリンクを貼る
  3. 管理ディレクトリ配下をバージョン管理ツールで変更管理
  4. 外部サーバと連携して、「dotfiles」をバックアップ

今回は気力の都合上、1,2のみを説明したいと思う。

3,4までやりたい人は、Git + GitHubを使った、下記サイトを参考にされては如何だろうか。

それでは、下記の手順について説明していく。

  1. 「dotfiles」を1つの管理ディレクトリにまとめる
  2. 管理ディレクトリ配下の「dotfiles」へリンクを貼る
  3. シェルスクリプトの作成
  4. 残課題: .login_confシンボリックリンクにすると読み込まれない
  5. 動作確認

残念ながら、後述する課題が残っており、暫定的に対応している。。。

1.「dotfiles」を1つのディレクトリへまとめる

まずは、バージョン管理ツールで管理したい設定ファイルを、1つの管理ディレクトリにまとめよう。
ここでは、管理ディレクトリを.dotfilesという名前でホームディレクトリ直下に作る。

また、多くのツールが利用する~/.configというディレクトリもついでに作成している。
既に.configディレクトリがある場合は作成不要。

> cd ~/  
> mkdir .dotfiles .config  

管理ディレクトリを作成したら、管理したいファイルとディレクトリを移動しよう。
以下は一例なので、実際に移動するファイルは、各自環境に合わせて検討して欲しい。

> mv .{config,cshrc,login,login_conf} .dotfiles/  

2. 管理ディレクトリ配下の「dotfiles」へリンクを貼る

設定ファイルは通常、「HOMEディレクトリ直下」など置く場所が決まっている。
設定ファイルを利用する各プログラムが、今まで通りアクセスできるように、移動前のパスから移動後のパスへリンクを貼ろう。

シェルスクリプトの作成

管理するファイルが増える度に、リンクを貼るコマンドを打つのは面倒だと思うので、
こちらのサイトを参考に、下記の簡単なシェルスクリプトを用意した。

update dotfiles link

スクリプトの挙動を簡単に説明をしておくと、
リンクを貼るのは管理ファイル直下に置いたファイル、またはディレクトリのみ。
($HOME/fileA -> 管理ディレクトリ/fileA でリンクを貼るイメージ)

ただし、11〜13行目で以下のファイルについてはリンクを貼らないようにしている。

この辺りは各自の環境に合わせて、好きに変えて頂きたい。

残課題: .login_confシンボリックリンクにすると読み込まれない

上記コードの19〜28行目で、実際にリンクを貼っている。
.login_confについては、シンボリックリンクにすると設定が反映されなくなったため、やむを得ずハードリンクにして対応した。

シンボリックリンクとハードリンクの違いについては、こちらのサイトを参照されたし。

エディタなどでファイルを修正する場合は、ハードリンクでも特に問題はないと思う。
問題になるのは、管理ディレクトリ配下のファイルを削除してしまった場合。

シンボリックリンクなら、HOMEディレクトリ配下のリンクは残っている。
管理ディレクトリ配下にまた同じ名前のファイルを置けば、削除前と同じようにリンクされる。

しかし、ハードリンクの場合、削除するとHOMEディレクトリには別の実体として残る。
管理ディレクトリ配下にまた同じ名前のファイルを置いても、下記のように別々のファイルになるだけだ。

  • $HOME/fileA ※古い実体を指したまま残ってる
  • 管理ディレクトリ/fileA

つまり、$HOME/fileAを編集しても、管理ディレクトリ/fileAには修正が反映されないし、逆もまた然り。

こうなると、本シェルスクリプトを再度実行してリンクを貼り直すしかない。

特に、git reset --hardなどのファイル削除を伴う操作で、上記事象が発生するので注意して欲しい。

もう少しマシな対策が見つかったときは、後日紹介したい。
もう少しマシな対策をご存知の方は、コメントでご教授下さいまし。

動作確認

シェルスクリプトの16行目に下記テスト用のコードを入れている。

echo "$f" && continue

シェルスクリプトをファイルに保存したら、実行権限を追加してそのままで実行してほしい。
リンクを貼る対象のファイル or ディレクトリの名前が出力されるはずだ。

> chmod +x install.sh  
> ./install.sh  
.config  
.cshrc  
.login  
.login_conf  

対象ファイルに問題なければ、16行目をコメントアウトして、再度を実行しよう。
下記のようにリンクが貼られるはずなので、各ツールが設定を読み込んでいるか確認しよう。

> ./install.sh  
/home/coro/.config -> /home/coro/.dotfiles/.config  
/home/coro/.cshrc -> /home/coro/.dotfiles/.cshrc  
/home/coro/.login -> /home/coro/.dotfiles/.login  
/home/coro/.login_conf => /home/coro/.dotfiles/.login_conf  

最後に

ひとまずこれで、個人用の設定ファイルを管理していくための最初の準備ができた。
あとは、GitなりMercurialなり好きなツールでバージョン管理し放題。
もっと凝った仕組みを作りたい人は、下記参考サイトを参考にされると良いかも。

以上。