免責事項: タイトルは少し大げさで、この問題に対する実績ある解決策は他にもあります。
最近、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
tono
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 の私の素晴らしいチームをフォローして、常につながりを保ってください。