免責事項: タイトルは少し大げさで、この問題に対する実績ある解決策は他にもあります。

最近、Hacker News のドットファイルを保存するためのソリューションに関するスレッドで、この驚くべきテクニックを読みました。 ユーザー StreakyCobra は彼のエレガントなセットアップを示し、そして … それはとても理にかなっていました! 私は今、自分のシステムを同じ手法に切り替えているところです。

彼の言葉を借りれば、以下のテクニックが必要です。

余分なツールは不要、シンボリックリンクは不要、ファイルはバージョン管理システムで追跡される、コンピューターごとに異なるブランチを使用できる、新しいインストールで簡単に設定を複製できる。

このテクニックは、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 フォルダーを作成しました。
  • それからエイリアス config を作成し、設定リポジトリとやり取りする際に通常の git の代わりに使用します。
  • まだ明確に追跡していないファイルを隠すために、リポジトリのローカルフラッグを設定しています。 これは、後で config status やその他のコマンドを入力したときに、追跡することに興味がないファイルが untracked として表示されないようにするためです。
  • また、エイリアス定義を手で .bashrc に追加することも、便利なように提供された 4 行目を使用することもできます。
    curl -Lks http://bit.do/cfg-init | /bin/bash

    設定を実行した後、$HOME フォルダ内の任意のファイルは、git を新しく作った config エイリアスに置き換えて、通常のコマンドでバージョン管理することが可能です。

    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
    • 次に、あなたの dotfiles をあなたの $HOME:
    git clone --bare <git-repo-url> $HOME/.cfg
    • 現在のシェル スコープのエイリアスを定義して、空のリポジトリにコピーしてください。
    alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
    • Checkout the actual content from the bare repository to your $HOME:
    config checkout
    • The step above might fail with a message such:
    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

    これは、$HOME フォルダにすでに設定ファイルがあり、Git によって上書きされる可能性があるためです。 解決策は簡単で、気になるならファイルをバックアップし、気にならないなら削除します。 問題のあるファイルをすべてバックアップ フォルダーに自動的に移動するための、簡単なショートカットを提供します。

config checkout
  • Set the flag showUntrackedFiles to no on this specific (local) repository:
config config --local status.showUntrackedFiles no
  • The complete, now on now you type config command to add and update your dotfiles…完了しました。
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

また、新しいマシンをセットアップする際にこれらの手順をすべて覚える必要がないように、簡単なスクリプトを作成して、私のように Bitbucket snippet として保存し、その短い 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 ; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

まとめ

この手法が設定のトラッキングに役に立つことが分かっていただければ幸いです。 もし興味があれば、私の dotfiles はここにあります。 また、@durdn や @atlassiandev の私の素晴らしいチームをフォローして、常につながりを保ってください。

コメントを残す

メールアドレスが公開されることはありません。