web-dev-qa-db-ja.com

さまざまなOS(osxとubuntuなど)のドットファイルを維持するための戦略

ドットファイル(vimrc、zshrc、tmux.confなど)を維持するためにGitリポジトリを使用しています。私は2つの異なるオペレーティングシステム(自宅のOSXと職場のUbuntu)を持っているので、各システムにブランチを用意しました。これにより、OSが同じツール/ライブラリを使用してジョブを実行するために使用されないため、ドットファイルのバージョンが異なります。これにより、すべてのブランチ(分岐したドットファイル)のドットファイルの保守が困難になります。これにはもっと良い戦略があるのではないかと考えていました。たぶん、システム固有のドットファイルを別のファイルに含めて、それらをドットファイルに含めます。

言い換えれば、私は異なるOSを搭載したコンピューターのドットファイルを維持するためのクロスプラットフォーム戦略を探しています。

助けてくれてありがとう

5
don ali

.zshrcのようなシェルスクリプトの場合、環境変数またはunameのようなコマンドへの回答を使用できます。ただし、.vimrcのようなシェル以外のドットファイルの場合は、あるブランチから別のブランチに(あるOSから別のOSに)パッチをコミットする手動作業を行う必要があります。

1
Envite

Enviteの回答に加えて、私は1つの一般的な.zshrcファイルを使用します。このファイルには、すべてのポータブルな ''のもの(シェル関数の定義など)が含まれています。さらに、共有構成を使用しているすべてのコンピューター用に、追加のファイル.zshrc-MACHINE_Aなどがあります。ここで私は例えばを定義します。 PATH、現在インストールされているプログラムを反映するエイリアスなど。

私の一般的な.zshrcファイルの最後の部分は

# load $Host specific setting

if [[ -f ~/.zshrc-$Host ]]; then
   [[ ! -f ~/.zshrc-$Host.zwc || ~/.zshrc-$Host -nt ~/.zshrc-$Host.zwc ]] && { zcompile ~/.zshrc-$Host; print - compiled \~/.zshrc-$Host. }
   source ~/.zshrc-$Host
fi

man zshparamによると、パラメータ$Hostには現在のホスト名が含まれているため、移植可能であり、外部プログラム呼び出しを保存する必要があります。そして、対応する.zshrc-$Hostファイルが変更されるたびに、(zcompileを介して)コンパイルされます。コンパイルは(私はman zshbuiltinsを引用します)の目的を果たします:

(...)ファイルの読み取り時にテキストの解析を回避することにより、関数の自動ロードとスクリプトの実行を高速化します。

おそらく最近は違いに気付かないでしょう(?)が、それも害はありません。ところで。コンパイルされた*.zwcファイルはアーキテクチャに依存し、異なるシステム間で交換することはできません。

1
mpy

これが 私が出会った最良の解決策 です。ここで読むのではなく、リンクをクリックすることをお勧めします。

アイデア

ファイル名が「.symlink」で終わるファイルをシンボリックリンクするという@holmanのアイデアを採用しました。代わりに、ファイル名が正規表現\.(<os>-)?symlink$と一致するファイルをシンボリックリンクしています。そうすることで、常にシンボリックリンクされているファイルと、特定の環境でのみシンボリックリンクされているファイルを作成できます。

たとえば、私の~/.gitconfigには、OS固有の構成を含む~/.gitconfig_includeを含めています。

[include]
    path = ~/.gitconfig_include

次に、2つの.gitconfig_includeファイルがあります。1つはLinux用で、もう1つはWindows用です。

dotfiles
|-- git
    |-- .gitconfig.symlink
    |-- .gitconfig_include.linux-symlink
    |-- .gitconfig_include.windows-symlink

これにより、シンボリックリンクに同じ名前を付けることができますが、OSに応じてターゲットが異なります。

残念ながら、この戦略では、クロスプラットフォームのドットファイルのすべての要件を処理するのに十分ではありませんでした。

WindowsでのVimの悪い決断

何らかの理由で、VimはWindowsでは~/vimfilesではなく~/.vimでファイルを検索します。つまり、同じ戦略を維持したい場合は、明らかな理由から、ファイルフォルダーを複製する必要があります。

dotfiles
|-- vim
    |-- .vim.linux-symlink
    |-- vimfiles.windows-symlink

Filesフォルダーを複製する代わりに、フォルダーの名前と一致する、拡張子が「.symlinks」のファイルを作成しました。

dotfiles
|-- vim
    |-- .vim
    |-- .vim.symlinks

.vim.symlinksファイルには、各環境のシンボリックリンク名が含まれています。

linux: .vim
windows: vimfiles

これにより、OSに応じて、シンボリックリンクの名前は異なりますが、ターゲットは同じになります。

実用的なソリューション

すべてがどのように終わったかを確認したい場合は、私の GitHubのドットファイル にアクセスしてください。

0
user1480704

私の解決策は、マシンごとに個別のリポジトリを用意することです。

Gitはシンボリックリンクをたどらず(単にそれらを格納するだけです)、 ハードリンクも機能しません なので、両方のマシンで同じファイルのリストを含むスクリプトを作成しました。リポジトリの1つに変更を加えた後、スクリプトを実行します。

このリポジトリで共有ファイルのいずれかが変更されたことを検出すると(チェックサムを計算します)、それらを他のリポジトリにコピーします。次に、そのリポジトリに変更し、そこにある変更をコミットします。

0
Roland Smith