通过stow集中管理你的dotfiles

自己的类unix系统也有好几个了,算上 MacBook Pro,wsl2 和云服务器就是三个,所以需要同步一些配置文件,这样各种快捷键在不同的设备上比较顺手。

Stow

GNU Stow是一个开源符号连接管理器,可以轻松的帮助我们将散落各地的 dotfiles 组织到一个文件夹,然后维护这个文件夹到 Github 仓库就可以实现轻松的版本管理,备份和多设备同步。

安装

  • MacOS 可以通过包管理器homebrew来安装,brew install stow
  • Ubuntu 可以通过sudo apt install stow来安装。

基础用法

假如你希望将$HOME/.zshrc$HOME/dotfiles/这个目录下进行管理:

1
2
3
4
5
6
cp ~/.zshrc ~/.zshrc.bak
mv ~/.zshrc ~/dotfiles/zsh
cd ~/dotfiles
stow zsh
# 确认无误可以删除备份
rm ~/.zshrc.bak

这时就会发现已经成功进行了软连接,所有的更改都将同步:

1
2
3
╭─lzy@MBP2017 ~
╰─$ cd ~ && ls -al | grep zshrc
lrwxr-xr-x lzy staff 19 B Fri Mar 15 00:36:25 2024 .zshrc ⇒ dotfiles/zsh/.zshrc

高级用法

  • 假如你想管理 nvim,它的 dotfile 在$HOME/.config/下,并且你不打算在~/dotfiles/下维护,而是在~/onedrive/dotfiles/这种别的路径,就需要指定一些参数,详情可搜索官方文档或者man stow
1
2
3
4
5
6
7
cp -r ~/.config/nvim ~/.config/nvim.bak
mv ~/.config/nvim ~/onedrive/dotfiles/
mkdir ~/.config/nvim
cd ~/onedrive/dotfiles/
stow --target=$HOME/.config/ nvim
# 成功了可以删除备份
rm -rf ~/.config/nvim.bak
  • 如果希望删除某个链接,可以通过-D来删除。

  • 虽说链接过的双方内容是同步的,但是如果新增或者删除了文件,就会有多余或缺失的链接,这时候可以通过-R,它会进行取消链接,重新链接的更新过程。

  • 对于不确定的操作,可以通过-n或者--simulate来进行模拟,它会告诉你即将进行的操作,但是不实际进行。

设置自己的一键更新脚本

当你在多设备之间切换时,git可以帮助你更新好配置文件,而已经存在的链接如果内容变化都是同步的。但是如果配置文件增加或者减少了,就需要-R参数重新链接,这个过程可以写成脚本自动运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

# 创建必要的配置目录
mkdir -p ~/.config/nvim
mkdir -p ~/.config/neofetch
mkdir -p ~/.config/tmux-powerline

# 切换到 dotfiles 目录
cd ~/dotfiles

# 使用 stow 链接配置
stow -R zsh
stow -R tmux
stow -R --target=$HOME/.config/nvim nvim
stow -R --target=$HOME/.config/neofetch neofetch
stow -R --target=$HOME/.config/tmux-powerline tmux-powerline

echo "Configurations have been stowed."

综上,将所有的配置文件放到一个文件夹,再链接回原处,这样子管理起来就比较方便啦。

dotfiles 多设备兼容性问题

对于同样是 zshrc 配置,不同的系统,有一些自然是可以共用的,但是有一些是某个系统特有的,或者说同一个命令具体参数不同,这里有两种方法。

按需加载

可以在.zshrc中放各个系统共同的配置,而不同的系统则放在同文件夹下.zshrc_mac这种文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 检测操作系统类型
OS_TYPE=$(uname)

# 根据操作系统类型加载特定配置
case "$OS_TYPE" in
Linux)
[[ -f ~/.zshrc_linux ]] && source ~/.zshrc_linux
;;
Darwin)
[[ -f ~/.zshrc_mac ]] && source ~/.zshrc_mac
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*)
[[ -f ~/.zshrc_windows ]] && source ~/.zshrc_windows
;;
*)
echo "Unknown OS type: $OS_TYPE"
;;
esac

主机名判断

也可以把它们就放在同一个文件,通过主机名写判断逻辑。

1
2
3
4
5
6
7
8
# Welcome message
if [[ $(hostname) == "MBP2017" ]]; then
figlet -c -f larry3d Welcome!
elif [[ $(hostname) == "Cloud" ]]; then
echo
echo
figlet -c Hello Ubuntu!
fi

我个人更倾向于后者,不同的部分大多数也是相似的命令,只是参数不同,摆在一起会比较好整理。

综上,多台设备也可以无感切换了,stow真是个好东西,感谢作者。


通过stow集中管理你的dotfiles
http://sinlatansen.github.io/2024/03/15/通过stow集中管理你的dotfiles/
作者
fugu
发布于
2024年3月15日
许可协议