※これは自作ブログに投稿したものと同じ記事です。
dotfilesで設定ファイルをバージョン管理
はじめに
以前参加したハッカソンでEC2を使ったときに、メンバーがdotfilesを使用して環境構築を行っていたのをきっかけに、自分もやりたいなーと思っていたのをついにやりました。
もっと早くやっとけばよかった。
ネットで探せば無限にdotfiles関係の記事は出てくるけど、自分のメモとして残しておく。(特にPrezto関係)
dotfilesって何よ?
ホームディレクトリに存在する.
で始まる設定ファイルを管理しておくリポジトリのこと。
Gitでバージョン管理されていて、githubで公開されていることが多いみたい。
ちなみにdotfilesという名前に意味はないけど、大体みんなこの名前にしとるって感じです。
元々はdockerで立てたコンテナに入ったときのターミナルが見辛すぎて、いつものprezto使いて~から構築にいたりました。これでPCが変わったり別のサーバーがで作業する時もいつもの設定で作業できます。便利。
どういう仕組み?
仕組みとしては単純で、dotfiles
といディレクトリを作成して、管理したい.
から始まる設定ファイルを移動させる。しかしそのままだと使えなくなるのでホームディレクトリにシンボリックリンクをはる。以上。って感じです。
-
.xxx
をdotfilesに移動させる - ホームディレクトリにシンボリックリンクをはる
導入方法
ファイルを選ぶ
まずは管理したい設定ファイルを選ぶ。ここで.ssh
などのファイルは絶対に入れないように気をつける。
とりあえず今あるものbackupをとっておく
ちょっと怖いので、ひとまずbackupをとっておく。自分はBACKUP
ディレクトリを作成して避難させた。
例としてzshの設定ファイルを管理する場合
$ cp .z* ~/BACKUP
dotfilesに移動させる
バックアップしたので、移動させる
$ mkdir ~/dotfiles
$ mv .z* ~/dotfiles
自分はzprezto系や○○env系のモノも入れた。
シンボリックリンクをはる
今のままだとホームディレクトリから設定ファイルがなくなってしまって動かなくなる。なのでdotfilesからホームディレクトリにシンボリックリンクをはる。
$ ln -s .zshrc ~/.zshrc
ただこれを毎回やるのはめんどくさいのでスクリプトを用意しておく。
僕はこちらの記事のものを使用させていただきました。
【初心者版】必要最小限のdotfilesを運用する - Qiita
# #!/bin/zsh
# DOT_FILES=(.*)
# for file in ${DOT_FILES[@]}; do
# ln -s $HOME/dotfiles/$file $HOME/$file
# done
# 未定義な変数があったら途中で終了する
set -u
# 今のディレクトリ
# dotfilesディレクトリに移動する
BASEDIR=$(dirname $0)
cd $BASEDIR
# dotfilesディレクトリにある、ドットから始まり2文字以上の名前のファイルに対して
for f in .??*; do
[ "$f" = ".git" ] && continue
[ "$f" = ".gitconfig.local.template" ] && continue
[ "$f" = ".gitmodules" ] && continue
# シンボリックリンクを貼る
ln -snfv ${PWD}/"$f" ~/
done
これで全部貼ってくれます。ヤッタネ。
僕はこのスクリプトにsetup.sh
という名前をつけて~/dotfiles/に保存している。
権限も忘れずに。
$ sudo chmod +x setup.sh
あとはgithubにあげるだけ!簡単だね!
落とし穴(Prezto)
実はこれが本題。
ここまでの手順でできたーと思っていたが、こないだdockerコンテナで構築しようとしたら全然うまくいかなかった。
ちなみに僕のdotfilesの中身。
.
├── .fzf.bash
├── .fzf.zsh
├── .git
├── .goenv
├── .p10k.zsh
├── .pyenv
├── .vscode
├── .zcompcache
├── .zcompdump
├── .zlogin
├── .zlogout
├── .zprezto
├── .zpreztorc
├── .zprofile
├── .zsh_history
├── .zshenv
├── .zshrc
├── install_brew.sh
├── install_zprezto.sh
├── README.md
└── setup.sh
ここで「なんでvscode入れとんねん!同期使えや!」の人。その通りです。
実は以前使っていたWindowsと同期していろいろ破壊されたことがあって怖くてやってないのです…
それはまあ置いておいて、ちゃんと入っているがうまくいってないない。というかzsh関係の中身が何もない。おかしいな…と思っていたが、ふとPreztoを入れたときのことを思い出した。
Preztoなんやねん
zshを使っている人はみんな使っている(と思っている)ターミナルの見た目をいい感じにしてくれるやつです。
これを入れるときに、何も考えず書かれている通りに次のコマンドを叩いていました。
// 設定ファイルを作成
$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
これ、cloneしてきた.zprezto/runcom/
にあるzsh系の設定ファイルを本体にして、ホームディレクトリにシンボリックリンクを貼ってるっぽい、

つまり…今まで本体だと思っていたzsh系のファイルは、全部.zprezto/runcom/
から貼られたシンボリックリンクだった。
それ故にgithubで追えてなかった。なんという…
本体である.zprezto/runcom/
にあるやつらをdotfilesに移動して名前を.~
に変更し、逆に.zprezto/runcom/に向けてシンボリックリンクを貼る。
これで無事動くようになった!
終わりに
これでどこでもPreztoのターミナルを使えるようになった。(zshは必要だけど)
ちなみにターミナルをカラフルにするためにexaを使ってます。
