- Published on
GNU Stowでdotfilesのシンボリックリンクを管理する
- Authors
- Name
- s1m4ne
- @s1m4ne
はじめに
研究の実験環境としてminikubeを使っているんですが、このごろターミナルを使う頻度が増えてきています。コードを書くときはVSCode内蔵のターミナルやmacデフォルトのターミナルアプリでもどうにかなりましたが、インフラ関連のことをやりたいとなると追加のソフトが必要です。
tmuxやzshのプラグインなどを追加するとかなり使いやすくなります。最近は色んなOSSを試しているのですが、Vimにはなかなか踏み出せていないのでいつか使えるようになりたいです...。
今回はdotfilesを導入する一環でGNU Stowを使った方が便利そうだと思ったので、簡単な概要や使い方についてまとめていきます。
dotfilesを導入する目先のメリットはあんまなさそうなんですが、雑多に管理されている設定ファイルの見通しは良くなると思います。またGit管理をしていればいつかメリットを感じる日が来ると思います。
dotfilesとは?
ホームディレクトリ(~/
)にある設定ファイルのことを指します。.zshrc
などの設定ファイルが有名でドットから始まっていることからdotfilesと呼ばれています。
このように設定ファイル自体をdotfilesとも表現しますが、一般的には設定ファイルの管理手法だったり設定ファイルが格納されたリポジトリのことをdotfilesと言います。
GitHubでdotfilesと検索するとこんな風にたくさんのdotfilesが公開されていることがわかります。
これは「GitHub側にdotfilesを公開してくれる便利な機能がある」というわけではなくて、文化的にdotfilesという名前のリポジトリとして設定ファイルを公開しているだけです。

dotfilesの管理方法
たくさんのdotfilesがGitHubで公開されていますが、ローカルでの管理方法がある程度慣習として決まっています。
設定ファイル(例:.zshrc
など)はホームディレクトリ直下(~/
)にあるので直接的にGit管理するは難しいです。そこでホームディレクトリ直下にdotfiles/
を作成して設定ファイルを全て移動します。このdotfiles/
をGit管理することでGitHub上でも公開することができます。
しかし移動したままではホームディレクトリ直下から設定ファイルがなくなってしまいます。そこで元の位置(ホームディレクトリ直下)に設定ファイルのシンボリックリンクを作成することでこの問題を解決します。
シンボリックリンクのイメージはこんな感じです。ホームディレクトリに.zshrc
というシンボリックリンクを作成して、その実体がdotfiles管理下(dotfiles/zsh/.zshrc
)にあります。こんな感じでファイルの実体を参照する仕組みになっています。これでファイルの実体だけをGit管理できます。
$ ls -la
lrwxr-xr-x 1 User staff Oct 4 18:39 .zshrc -> dotfiles/zsh/.zshrc
GNU Stowとは?
先ほど説明したシンボリックリンクですが、設定ファイルの数だけ全て自分で張る必要があります。シンボリックリンクを作成するコマンドはこんな感じです。
ln -s ~/dotfiles/zsh/.zshrc ~/.zshrc
手動でやるのは大変なので、通常はシンボリックリンクをシェルスクリプトなどで自動化して作成しますが、それをやってくれるのがGNU Stowです。なのでシンボリックリンクを張ってくれるだけのツールなので、設定ファイルを~/dotfiles/
に移動するのは自分でやる必要があります。シンプルなツールです。
stowコマンドについて
stowコマンドはシンボリックリンクを作成するコマンドです。引数にカレントディレクトリ直下のサブディレクトリを指定することで、カレントディレクトリの一つ上の階層にリンボリックリンクを作成します。
例えばdotfiles/
に設定ファイルを以下のように配置したとします。分類用のディレクトリとしてbase
とconfig
とzsh
を作成しています。そしてその中に設定ファイルを配置しています。
~/dotfiles
├── base
│ ├── .gitconfig
│ ├── .tmux.conf
│ └── .vimrc
├── config
│ └── .config
│ ├── alacritty/
│ └── nvim/
└── zsh
└── .zshrc
上記のようなディレクトリ構成の場合、設定ファイルが入っているサブディレクトリを引数として実行してあげれば、ホームディレクトリ直下に設定ファイルのシンボリックリンクが配置されます。
stow base
stow config
stow zsh
実行後はこんな感じになります。
$ ls -la ~
total 32
drwxr-xr-x 8 user staff 256 Oct 5 12:34 .
drwxr-xr-x 4 root staff 128 Oct 5 10:00 ..
lrwxr-xr-x 1 user staff 28 Oct 5 12:34 .gitconfig -> dotfiles/base/.gitconfig
lrwxr-xr-x 1 user staff 27 Oct 5 12:34 .tmux.conf -> dotfiles/base/.tmux.conf
lrwxr-xr-x 1 user staff 25 Oct 5 12:34 .vimrc -> dotfiles/base/.vimrc
lrwxr-xr-x 1 user staff 23 Oct 5 12:34 .zshrc -> dotfiles/zsh/.zshrc
lrwxr-xr-x 1 user staff 28 Oct 5 12:34 .config -> dotfiles/config/.config
drwxr-xr-x 7 user staff 224 Oct 5 12:34 dotfiles
手順
実際にdotfilesを導入する手順を紹介します。
1. GitHubでdotfilesリポジトリを作成する
まずGitHub上で作成します。
git clone
する
2. ホームディレクトリで先ほど作成したdotfilesリポジトリをホームディレクトリでクローンしてください。
~/dotfiles
に移動する
3. 設定ファイルを設定ファイルを~/dotfiles
に移動します。
この際に分類用のサブディレクトリを作成することができます。例えば私の場合は以下のようにzsh
関連の設定ファイルだけディレクトリを分けています。configに関しては構造が他と違うので専用のconfig/を作成しています。
~/dotfiles
├── base
│ ├── .gitconfig
│ ├── .tmux.conf
│ └── .vimrc
├── config
│ └── .config
│ ├── alacritty/
│ └── nvim/
└── zsh
└── .zshrc
上記の例ではサブディレクトリで分類しましたが、直接配置することも可能です。その場合stow .
でシンボリックリンクを作成することになります。
※注意点 .ssh
などの機密情報が入ったファイルはdotfiles/
に移動させないでください。GitHub上に公開されることになります。
4. GNU Stowのインストール
インストールしてください。
brew install stow
5. ディレクトリ移動してシンボリックリンクの作成
stow
コマンドは引数にサブディレクトリを指定します。もしサブディレクトリを作成していない場合はstow .
で作成できます。
cd ~/dotfiles
stow base
stow config
stow zsh
6. 確認
こんな感じになります。
$ ls -la ~
total 32
drwxr-xr-x 8 user staff 256 Oct 5 12:34 .
drwxr-xr-x 4 root staff 128 Oct 5 10:00 ..
lrwxr-xr-x 1 user staff 28 Oct 5 12:34 .gitconfig -> dotfiles/base/.gitconfig
lrwxr-xr-x 1 user staff 27 Oct 5 12:34 .tmux.conf -> dotfiles/base/.tmux.conf
lrwxr-xr-x 1 user staff 25 Oct 5 12:34 .vimrc -> dotfiles/base/.vimrc
lrwxr-xr-x 1 user staff 23 Oct 5 12:34 .zshrc -> dotfiles/zsh/.zshrc
lrwxr-xr-x 1 user staff 28 Oct 5 12:34 .config -> dotfiles/config/.config
drwxr-xr-x 7 user staff 224 Oct 5 12:34 dotfiles