如何从远程存储库加载鱼配置?

How to load fish configuration from a remote repository?

我在不同的地方(家庭网络、云端……)有无数台机器,我在每台机器上都使用 fish。问题是每次更改其中的内容时我都必须同步它们的配置。

有没有办法从远程存储库加载配置? (= 存储它的地方,不一定 git 但理想情况下我会在 GitHub 中管理它们)。在这种情况下,我会到处都有一个班轮。

您的问题分为两部分。第一部分不是特定于鱼的。对于我经常使用的系统,我使用 Dropbox。我将我的 ~/.config/fish 目录放在 Dropbox 目录中并对其进行符号链接。对于我不经常使用的机器,例如我用来调查发行版特有问题的虚拟机,我使用 rsync 从我的主要台式机复制。例如,

rsync --verbose --archive --delete -L --exclude 'fishd.*' krader@macpro:.config .

注意 fishd.* 模式的排除。那是你问题的第二部分,是鱼所独有的。 ~/.config/fish 目录中以该模式命名的文件是通用变量存储,目前对于每台机器都是唯一的。我们想改变这一点——见 https://github.com/fish-shell/fish-shell/issues/1912。问题是文件包含颜色主题变量。所以要复制你的颜色主题需要在一台机器上导出这些变量:

set -U | grep fish_color_

然后在新机器上对前面命令的每一行输出执行 set -U。显然,如果你有其他想要同步的通用变量,你应该只做 set -U 并导入所有它们。

免责声明:我自己不会选择这个解决方案。按照 Kurtis Rader 的建议使用云存储客户端或使用定期的 cron 作业从 git 存储库(+ 符号链接)中提取更改似乎更容易并且不会失败。


在那些你不能或不想与你的云存储同步的系统上,你可以专门下载配置文件,例如使用curl。利用 HTTP 缓存控制机制可以节省一些宝贵的 I/O 时间。无论有没有缓存控制,您仍然需要每次(或每经过 X 次或每次 Y 次)创建到远程服务器的连接,这已经浪费了很多时间。

以下是针对此类鱼脚本的建议,可帮助您入门:

#!/usr/bin/fish

set -l TMP_CONFIG /tmp/shared_config.fish

curl -s -o $TMP_CONFIG -D $TMP_CONFIG.headers \
 -H "If-None-Match: \"$SHARED_CONFIG_ETAG\"" \
 https://raw.githubusercontent.com/woj/dotfiles/master/fish/config.fish

if test -s $TMP_CONFIG
  mv $TMP_CONFIG ~/.config/fish/conf.d/shared_config.fish
  set -U SHARED_CONFIG_ETAG (sed -En 's/ETag: "(\w+)"//p' $TMP_CONFIG.headers)
end

备注:

  • 警告:测试还不够
  • 假定 fish v2.3 或更高版本。
  • sed 行为因平台而异。
  • woj/dotfiles/master/fish/config.fish 替换为适用于您的案例的存储库、分支和路径。

您可以 运行 通过 cron 作业执行此操作,但如果您坚持在每次初始化时更新配置文件,请更改脚本以将配置放置在 [=12 尚未自动加载的路径中=],例如:
mv $TMP_CONFIG ~/.config/fish/shared_config.fish
在你的 config.fish 运行 整个脚本文件中,然后是
source ~/.config/fish/shared_config.fish