我使用 Git 存储库来维护我的点文件(vimrc、zshrc、tmux.conf 等)。由于我有两个不同的操作系统(家里的 OSX 和工作中的 Ubuntu),我为每个系统都专门设立了一个分支。这会导致点文件版本不同,因为操作系统不习惯使用相同的工具/库来完成工作。这使得所有分支(分散的点文件)的点文件维护变得困难。我在想是否有更好的策略。也许可以将系统特定的点文件包含在另一个文件中,然后将它们包含在点文件中。
换句话说,我正在寻找一种跨平台策略来维护具有不同操作系统的计算机的点文件。
提前感谢你的帮助
答案1
对于 .zshrc 之类的 shell 脚本,您可以使用环境变量或 uname 之类的命令的答案。但对于 .vimrc 之类的非 shell 点文件,您应该手动将补丁从一个分支提交到另一个分支(从一个操作系统提交到另一个操作系统)。
答案2
除了 Envite 的回答之外:我使用一个通用.zshrc
文件,其中包含所有“可移植”内容(如 shell 函数定义等)。此外,.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
文件依赖于体系结构,不能在不同系统之间交换。
答案3
这里是我遇到的最好的解决方案。我建议点击链接,而不是在这里阅读:
理念
我改编了@holman关于符号链接文件名以“ .symlink”结尾的文件的想法,而是符号链接文件名与正则表达式匹配的文件
\.(<os>-)?symlink$
。通过这样做,我可以拥有始终符号链接的文件,以及仅在特定环境中符号链接的文件。例如,在我的里面
~/.gitconfig
我包含~/.gitconfig_include
了特定于操作系统的配置。[include] path = ~/.gitconfig_include
然后我有两个 .gitconfig_include 文件:一个用于 Linux,另一个用于 Windows。
dotfiles |-- git |-- .gitconfig.symlink |-- .gitconfig_include.linux-symlink |-- .gitconfig_include.windows-symlink
这允许符号链接具有相同的名称,但具有不同的目标,具体取决于操作系统。
不幸的是,这个策略不足以满足我的跨平台点文件的所有要求。
Vim 在 Windows 上的错误决定
~/vimfiles
由于某种原因,Vim 在 Windows 中而不是在 Windows 中查找文件~/.vim
。这意味着,如果我想保持相同的策略,我必须复制文件夹 — 出于显而易见的原因,我不想这样做。dotfiles |-- vim |-- .vim.linux-symlink |-- vimfiles.windows-symlink
我没有复制文件夹,而是创建了一个与文件夹名称匹配的文件,并以“.symlinks”为扩展名。
dotfiles |-- vim |-- .vim |-- .vim.symlinks
.vim.symlinks 文件包含每个环境的符号链接名称。
linux: .vim windows: vimfiles
这允许符号链接具有不同的名称,但具有相同的目标,具体取决于操作系统。
有效的解决方案
如果你想了解事情的结局,请访问我的GitHub 上的点文件。
答案4
我的解决方案是为每台机器设置单独的存储库。
由于 git 不跟踪符号链接(它只是存储它们),并且硬链接也不起作用,我编写了一个脚本,其中包含两台机器上相同的文件列表。在其中一个存储库中进行更改后,我运行该脚本。
如果它检测到(我计算校验和)此存储库中的任何共享文件已更改,它会将其复制到另一个存储库。然后我切换到该存储库并提交那里的更改。