Dotfiles: ベア Git リポジトリに保存する最もよい方法

免責事項: このタイトルは少々大げさですが、この問題に対する他の実証済みの解決策もあります。ただし、下のテクニックはとてもエレガントだと思います。

最近、ドットファイルを保存する人々のソリューションに関する Hacker News のスレッドでこの驚くべき手法について読みました。ユーザーの StreakyCobra 氏は、エレガントなセットアップ方法を示し、それはとても理にかなっていました。私は現在、自分のシステムを同じ手法に切り替えようとしています。唯一の前提条件は Git をインストールすることです。

彼の言葉では、この手法には以下が必要です。

追加のツールやシンボリックリンクは不要で、ファイルはバージョン管理システムで追跡され、コンピューターごとに異なるブランチを使用でき、新規インストール時に簡単に構成を複製できます。

この手法は、特別に細工されたエイリアスを使用して、Git ベア リポジトリサイド フォルダー ($HOME/.cfg または $HOME/.myconfig など) に格納することで、(他の Git リポジトリと干渉する) 通常の .git ローカル フォルダーではなく、そのリポジトリに対してコマンドが実行されるようにすることで構成されています。

ゼロから始める

Git リポジトリで設定を追跡したことがない場合は、次のように何行かコマンドを入力してこの手法を簡単に使い始めることができます。

git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • 最初の行では、ファイルを追跡する Git ベア リポジトリである ~/.cfg というフォルダーが作成されます。
  • 次に、設定リポジトリとやりとりしたい場合に使用する通常の git の代わりに使用するエイリアス config を作成します。
  • まだ明示的に追跡していないファイルを隠すために、リポジトリに対してローカルなフラグを設定します。これは、後で config status とその他のコマンドを後で入力するときに、追跡の対象外のファイルが untracked として表示されないようにするためです。
  • また、エイリアス定義を .bashrc に手動で追加することも、便宜上提供されている 4 行目を使用することもできます。

私は、上記の行を Bitbucket 上の スニペットにパッケージ化し、短い URL からリンクしました。これで、以下のように設定できます。

curl -Lks http://bit.do/cfg-init | /bin/bash

セットアップを実行した後、次のように、git を新しく作成した config エイリアスに置き換えて、$HOME フォルダー内の任意のファイルを通常のコマンドでバージョン管理できます。

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

ドットファイルを新しいシステムにインストールする (またはこのセットアップに移行する)

設定/ドットファイルを既に Git リポジトリに保存している場合、新しいシステムでは、次の手順でこのセットアップに移行できます。

  • インストールの前に、エイリアスが .bashrc または .zsh にコミットされていることを確認してください。
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • そして、奇妙な再帰問題が起きないように、ソース リポジトリでクローン対象のフォルダーを無視するようにします。
echo ".cfg" >> .gitignore
  • ここで、ドットファイルを $HOMEドット フォルダー内のベア リポジトリにクローンします。
git clone --bare <git-repo-url> $HOME/.cfg
  • 現在のシェル スコープでエイリアスを定義します。
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • ベア リポジトリから $HOME に実際のコンテンツをチェック アウトします。
config checkout
  • 上記の手順は失敗し、次のようなメッセージが表示されることがあります。
error: The following untracked working tree files would be overwritten by checkout:
    .bashrc
    .gitignore
Please move or remove them before you can switch branches.
Aborting

これは、Git によって上書きされるストック設定ファイルが $HOME フォルダーに既にいくつか存在している可能性があるためです。解決策は簡単です。ファイルが大切である場合はバックアップし、大切でない場合は削除します。問題のあるファイルをすべて自動的にバックアップ フォルダーに移動するための大まかなショートカットを用意しました。

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
  • 問題が発生した場合は、チェック アウトを再実行します。
config checkout
  • この特定の (ローカル) リポジトリで showUntrackedFiles フラグを no に設定します。
config config --local status.showUntrackedFiles no
  • これで完了です。これからは config コマンドを入力してドットファイルを追加したり更新したりできます。
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

ここでも、セットアップする新しいマシンでこれらすべての手順を覚えておかなくても済むためのショートカットとして、簡単なスクリプトを作成し、先ほど行ったように Bitbucket スニペットとして保存し、短い URL を作成して、次のように呼び出すことができます。

curl -Lks http://bit.do/cfg-install | /bin/bash

完全を期すために、私が最終的に作成したものを次に示します (新しく作成された多くの Alpine Linux コンテナでテストしました)。

git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
   /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if [ $? = 0 ]; then
  echo "Checked out config.";
  else
    echo "Backing up pre-existing dot files.";
    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

まとめ

この手法が設定の追跡に役立つことを願っています。興味がおありなら、私のドットファイルをここでご確認ください。また、@durdn で私を、そして @atlassiandev ですばらしいチームをフォローして、常に最新の情報を入手してください。

Git を学習する準備はできていますか?

この対話式チュートリアルを利用しましょう。

今すぐ始める