如何从远程存储库加载鱼配置?
How to load fish configuration from a remote repository?
我在不同的地方(家庭网络、云端……)有无数台机器,我在每台机器上都使用 fish
。问题是每次更改其中的内容时我都必须同步它们的配置。
有没有办法从远程存储库加载配置? (= 存储它的地方,不一定 git
但理想情况下我会在 GitHub 中管理它们)。在这种情况下,我会到处都有一个班轮。
- 我不太在意启动时间,每次加载配置都可以接受
- 我无法将配置推送到机器(例如通过 Ansible)- 并非所有机器都可以直接从任何地方访问 - 但所有机器都可以访问互联网
您的问题分为两部分。第一部分不是特定于鱼的。对于我经常使用的系统,我使用 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
我在不同的地方(家庭网络、云端……)有无数台机器,我在每台机器上都使用 fish
。问题是每次更改其中的内容时我都必须同步它们的配置。
有没有办法从远程存储库加载配置? (= 存储它的地方,不一定 git
但理想情况下我会在 GitHub 中管理它们)。在这种情况下,我会到处都有一个班轮。
- 我不太在意启动时间,每次加载配置都可以接受
- 我无法将配置推送到机器(例如通过 Ansible)- 并非所有机器都可以直接从任何地方访问 - 但所有机器都可以访问互联网
您的问题分为两部分。第一部分不是特定于鱼的。对于我经常使用的系统,我使用 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