「ドットファイル」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
16行目: 16行目:
 
ドットファイルを直接 Git で追跡することの利点は、[[Git]] だけで済み、シンボリックリンクを必要としないことです。デメリットは、[[#ホスト固有の設定|ホスト固有の設定]] では一般的に複数の [[Git#Branching|branches]] に変更をマージする必要があるということです。
 
ドットファイルを直接 Git で追跡することの利点は、[[Git]] だけで済み、シンボリックリンクを必要としないことです。デメリットは、[[#ホスト固有の設定|ホスト固有の設定]] では一般的に複数の [[Git#Branching|branches]] に変更をマージする必要があるということです。
   
このアプローチを実現する最もシンプルな方法は、ホームディレクトリに直接 [[Git]] リポジトリを初期化し、{{man|5|gitignore}} パターンの {{ic|*}} でデフォルトで全てのファイルを無視することです。しかし、この方法にはつの欠点があります。ホームディレクトリに他の Git リポジトリがある場合混乱することがあります(えば、リポジトリの初期化を忘れると、突然 dotfile リポジトリを操作することになります)また、(無視されるので)現在のディレクトリのどのファイルが追跡されていないかを簡単に確認することができなくなりました
+
このアプローチを実現する最も簡単な方法は、[[Git]] リポジトリをホームディレクトリで直接初期化し、デフォルトで {{man|5|gitignore}} パターンの {{ic|*}} を使用してすべてのファイルを無視することです。ただし、この方法には 2 つの欠点があります。ホームディレクトリに他の Git リポジトリがある場合混乱する可能性があります (たとえば、リポジトリの初期化を忘れた場合、突然 dotfile リポジトリを操作することになります) また、ディレクトリのどのファイルが簡単に確認できなくなりま現在のディレクトリは追跡されません (無視されるため)
   
 
これらの欠点がない別の方法として、[https://news.ycombinator.com/item?id=11071754 Ask Hacker News] で人気のある "bare repository and alias method" があります。これは、3つのコマンドでセットアップすることができます。
 
これらの欠点がない別の方法として、[https://news.ycombinator.com/item?id=11071754 Ask Hacker News] で人気のある "bare repository and alias method" があります。これは、3つのコマンドでセットアップすることができます。
24行目: 24行目:
 
$ config config status.showUntrackedFiles no
 
$ config config status.showUntrackedFiles no
   
  +
このドットファイルを使って新しいシステムに複製できます:
そうすると、作成した [[エイリアス]] でドットファイルを管理することができます。もし [[Bash]] を使っていてこのエイリアスを bash 補完したい場合は、{{AUR|bash-complete-alias}} をインストールして、エイリアスと次の行を {{ic|~/.bashrc}} に追加してください。
 
  +
  +
$ git clone --bare <git-repo-url> $HOME/.dotfiles
  +
$ alias config='/usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME"'
  +
$ config checkout
  +
$ config config --local status.showUntrackedFiles no
  +
  +
* 上書きされる可能性のあるいくつかのストック設定がすでにある場合は、次のようなエラーが発生します:
  +
:{{bc|<nowiki>
  +
$ 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
  +
</nowiki>}}
  +
  +
:既存のファイルを書き換える {{ic|$ config checkout -f}} を使用することもできます。または、より安全な方法として、次のスクリプトを使用してすべてのファイルのバックアップを取得し、{{ic|checkout}} を使用することもできます:
  +
:{{bc|<nowiki>
  +
mkdir -p .config-backup && \
  +
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
  +
xargs -I{} mv {} .config-backup/{}
  +
</nowiki>}}
  +
  +
その後、作成した [[エイリアス]] でドットファイルを管理することができます。もし [[Bash]] を使っていてこのエイリアスを bash 補完したい場合は、{{AUR|bash-complete-alias}} をインストールして、エイリアスと次の行を {{ic|~/.bashrc}} に追加してください。
   
 
$ complete -F _complete_alias config
 
$ complete -F _complete_alias config
33行目: 57行目:
 
__git_complete config __git_main
 
__git_complete config __git_main
   
{{Tip|機密情報を誤ってコミットしないようにするには、[https://wiki.archlinux.org/title/Git#Filtering_confidential_information Git#Filtering confidential information]を参照してください。}}
+
{{Tip|機密情報を誤ってコミットしないようにするには、[https://wiki.archlinux.org/title/Git#Filtering_confidential_information Git#Filtering confidential information] を参照してください。}}
   
 
== ホスト固有の設定 ==
 
== ホスト固有の設定 ==

2024年2月10日 (土) 21:13時点における版

関連記事

ユーザー固有のアプリケーション設定は、伝統的に ドットファイル(ファイル名がドットで始まるファイル) に保存されています。変更を追跡し、さまざまなホスト間でドットファイルを同期するために、Git などの バージョン管理システム でドットファイルを管理することは一般的な方法です。ドットファイルを管理するには、さまざまな方法があります(例えば、ホームディレクトリでドットファイルを直接追跡する、サブディレクトリに保存する、シェルスクリプト や専用ツール でファイルをシンボリックリンク/コピー/生成するなど)。ドットファイルの管理方法とは別に、この記事には、ドットファイルのリボジトリのリスト も含まれています。

ドットファイルを Git で直接追跡する

ドットファイルを直接 Git で追跡することの利点は、Git だけで済み、シンボリックリンクを必要としないことです。デメリットは、ホスト固有の設定 では一般的に複数の branches に変更をマージする必要があるということです。

このアプローチを実現する最も簡単な方法は、Git リポジトリをホームディレクトリで直接初期化し、デフォルトで gitignore(5) パターンの * を使用してすべてのファイルを無視することです。ただし、この方法には 2 つの欠点があります。ホームディレクトリに他の Git リポジトリがある場合は混乱する可能性があります (たとえば、リポジトリの初期化を忘れた場合、突然 dotfile リポジトリを操作することになります) また、ディレクトリ内のどのファイルが簡単に確認できなくなります。現在のディレクトリは追跡されません (無視されるため)

これらの欠点がない別の方法として、Ask Hacker News で人気のある "bare repository and alias method" があります。これは、3つのコマンドでセットアップすることができます。

$ git init --bare ~/.dotfiles
$ alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
$ config config status.showUntrackedFiles no

このドットファイルを使って新しいシステムに複製できます:

$ git clone --bare <git-repo-url> $HOME/.dotfiles
$ alias config='/usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME"'
$ config checkout
$ config config --local status.showUntrackedFiles no
  • 上書きされる可能性のあるいくつかのストック設定がすでにある場合は、次のようなエラーが発生します:
$ 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
既存のファイルを書き換える $ config checkout -f を使用することもできます。または、より安全な方法として、次のスクリプトを使用してすべてのファイルのバックアップを取得し、checkout を使用することもできます:
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}

その後、作成した エイリアス でドットファイルを管理することができます。もし Bash を使っていてこのエイリアスを bash 補完したい場合は、bash-complete-aliasAUR をインストールして、エイリアスと次の行を ~/.bashrc に追加してください。

$ complete -F _complete_alias config

bash で補完させるもう一つの方法は、~/.bashrc に以下を追加することです。([1] から引用)

source /usr/share/bash-completion/completions/git
__git_complete config __git_main
ヒント: 機密情報を誤ってコミットしないようにするには、Git#Filtering confidential information を参照してください。

ホスト固有の設定

様々なマシンで dotfiles を同期させる際によくある問題が、ホスト固有の設定です。

Git では、すべての共有設定を master ブランチで管理し、個々のマシンにはマシン固有のブランチをチェックアウトすることでこれを解決できます。ホスト固有の設定はマシン固有のブランチにコミットすることができます。共有設定が master ブランチで変更された場合、マシンごとのブランチは更新された master の上にリベースされる必要があります。

シェル設定ファイル のような設定スクリプトでは、条件付きロジックを使用することができます。例えば、Bash スクリプト (すなわち .bashrc) は、マシン名 (またはタイプ、カスタム変数など) に応じて異なる設定を適用することができます。

if [[ "$(hostname)" == "archlaptop" ]]; then
    # laptop specific commands here
else
    # desktop or server machine commands
fi

同様のことは、.Xresources でも実現できます。[2]

Git ブランチのリベースが面倒だと感じる場合は、ファイルのグループ化 をサポートする ツール や、さらに柔軟性を求めるなら 加工処理 を行うツールを使用するとよいでしょう。

ツール

ファイルのグループ化
設定ファイルを設定グループ (プロファイルまたはパッケージとも呼ばれる) にグループ化する方法です。

処理

ホストによってカスタマイズできるように、設定ファイルを処理するツールもあります。
名前 パッケージ 言語 ファイルのグループ化 処理
dotbot chezmoi Python 設定ファイル No
chezmoi dotbotAUR Go ディレクトリベース Go テンプレート
dot-templater dot-templater-gitAUR Rust ディレクトリベース カスタムシンタックス
toml-bombadil toml-bombadil Rust 設定ファイル tera
dotdrop dotdropAUR Python 設定ファイル Jinja2
dotfiles dotfilesAUR Python No No
Dots dots-managerAUR Python ディレクトリベース カスタム追加ポイント
dotter dotter-rsAUR Rust 設定ファイル Handlebars
dt-cli dt-cliAUR Rust 設定ファイル Handlebars
GNU Stow stow Perl ディレクトリベース [3] No
Mackup mackupAUR Python アプリケーションごとに自動 No
mir.qualia mir.qualiaAUR Python No カスタムブロック
rcm rcmAUR Perl ディレクトリベース (ホストまたはタグによる) No
yas-bdsm Shell ディレクトリベース No

Git を wrapping するツール

Git に不安がある場合は、バージョン管理システムを (多かれ少なかれ) 抽象化するこれらのツールのいずれかを使用することをお勧めします。

名前 パッケージ 言語 ファイルのグループ化 処理
dotbare dotbareAUR Shell (fzf) リポジトリ的 No
dotgit dotgitAUR Python ファイル名ベース No
homeshick homeshick-gitAUR Bash リポジトリ的 No
homesick Ruby リポジトリ的 No
Pearl pearl-gitAUR Python リポジトリ的 No
vcsh vcsh Shell リポジトリ的 No
yadm(1) yadm Bash ファイル名ベース
(by class/OS/distro/hostname/user)[4]
組み込みのテンプレート /Jinja2/ESH [5]
(オプション)
dfm dfmAUR Perl リポジトリ的 No
  1. GPG または OpenSS による機密ファイルの暗号化をサポートします。 [6]

ユーザーリポジトリ

作者 シェル WM / DE エディタ ターミナル マルチプレクサ オーディオ モニター メール IRC
Ambrevar zsh awesome emacs rxvt-unicode cmus htop/vicious mutt
awal fish i3 vim sakura tmux i3status The Lounge
ayekat zsh karuiwm vim rxvt-unicode tmux ncmpcpp/mpd karuibar mutt irssi
bamos zsh i3/xmonad vim/emacs rxvt-unicode tmux mpv/cmus conky/xmobar mutt ERC
brisbin33 zsh xmonad vim rxvt-unicode screen dzen mutt irssi
cinelli zsh dwm vim termite-git pianobar htop mutt-kz weechat
dillebidum zsh/mksh dwm/i3 vim/vis st tmux/dvtm ncmpcpp/mpv htop/i3blocks mutt ii/irssi
Earnestly zsh i3/orbment vim/emacs termite tmux mpd conky mutt weechat
ErikBjare zsh xmonad/xfce4 vim terminator tmux xfce4-panel weechat
falconindy bash i3 vim rxvt-unicode ncmpcpp conky mutt
graysky zsh xfce4 vim terminal ncmpcpp custom thunderbird
hugdru zsh awesome neovim rxvt-unicode tmux thunderbird weechat
insanum bash herbstluftwm vim evilvte tmux dzen mutt-kz
izmntuk zsh xfce4 vim rxvt-unicode/yaft tmux cmus xfce4-panel irssi
jasonwryan bash/zsh dwm vim rxvt-unicode tmux ncmpcpp custom mutt irrsi
jdevlieghere zsh xmonad vim terminal tmux htop mutt weechat
jelly zsh i3 vim termite tmux ncmpcpp mutt-kz-git weechat
maximbaz zsh i3-gaps neovim alacritty tmux py3status thunderbird
meskarune bash herbstluftwm vim rxvt-unicode screen conky weechat
neersighted zsh i3 vim rxvt-unicode tmux ncmpcpp htop mutt irssi
OK100 bash dwm vim rxvt-unicode cmus conky, dzen mutt weechat
pid1 zsh dwm neovim st tmux custom mutt weechat
polyzen zsh i3 vim termite tmux i3status weechat
sistematico zsh/fish/bash i3 Gaps vim/nano termite tmux ncmpcpp polybar mutt weechat
swalladge zsh/bash i3 neovim/vim termite tmux cmus i3pystatus mutt
thiagowfx bash/zsh i3 vim/emacs rxvt-unicode ncmpcpp i3blocks
unexist zsh subtle vim rxvt-unicode ncmpcpp mutt irssi
vodik zsh xmonad vim termite-git tmux ncmpcpp custom mutt weechat
w0ng zsh dwm vim rxvt-unicode tmux ncmpcpp custom mutt irssi
whitelynx fish i3 neovim kitty i3pystatus
whynothugo zsh sway neovim alacritty mpv waybar, top neomutt
wryonik zsh i3-gaps-rounded vim terminator cmus htop, i3blocks, gotop

参照