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 からリンクしました。これで、以下のように設定できます。
関連資料
Git リポジトリ全体を移動する方法
ソリューションを見る
Bitbucket Cloud での Git の使用方法についてのチュートリアルです。
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 ですばらしいチームをフォローして、常に最新の情報を入手してください。
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。