dotfiles 管理:换台机器五分钟恢复手感

每次重装系统都要重新配一遍 shell、vim、git,很浪费时间。把配置文件版本化,换机器就是一条命令的事。

一、哪些文件值得管

文件内容
~/.bashrc / ~/.zshrcshell 别名、函数、提示符
~/.vimrcvim 配置
~/.gitconfig用户名、邮箱、别名
~/.tmux.conftmux 配置
~/.ssh/configSSH 主机别名(注意不要放私钥
~/.inputrcreadline 行为

不要放进去的:私钥、含密码的文件、token。

二、结构

常见两种组织方式:

bash
# 方式 A:直接放(简单)
dotfiles/
├── bashrc
├── vimrc
├── gitconfig
├── tmux.conf
├── install.sh
└── README.md

# 方式 B:按应用分目录(配合 stow)
dotfiles/
├── bash/.bashrc
├── vim/.vimrc
├── git/.gitconfig
└── tmux/.tmux.conf

小项目用方式 A 就够,配 install.sh 做软链。

三、install.sh:创建软链接

bash
#!/usr/bin/env bash
# install.sh —— 把仓库里的配置软链到 $HOME
set -euo pipefail

DOT="$(cd "$(dirname "$0")" && pwd)"
BACKUP="$HOME/.dotfiles-backup-$(date +%s)"

link() {
  local src="$1" dst="$2"
  # 目标已存在且不是软链 → 先备份
  if [ -e "$dst" ] && [ ! -L "$dst" ]; then
    mkdir -p "$BACKUP"
    mv "$dst" "$BACKUP/"
    echo "已备份原文件 → $BACKUP/$(basename "$dst")"
  fi
  ln -sfn "$src" "$dst"
  echo "链接 $dst → $src"
}

link "$DOT/bashrc"      "$HOME/.bashrc"
link "$DOT/vimrc"       "$HOME/.vimrc"
link "$DOT/gitconfig"   "$HOME/.gitconfig"
link "$DOT/tmux.conf"   "$HOME/.tmux.conf"
link "$DOT/inputrc"     "$HOME/.inputrc"

echo "完成。执行 source ~/.bashrc 生效。"
bash
chmod +x install.sh && ./install.sh

用软链接而不是复制:改仓库里的文件就等于改配置,反向同步不用做。

四、用 GNU stow(推荐)

stow 专门做这件事,能自动处理目录结构:

bash
sudo apt install -y stow

cd ~/dotfiles
stow bash vim git tmux      # 按目录名创建软链
stow -D bash                # 撤销
stow -R vim                 # 重做(先撤再建)

# 预演:看会做什么
stow -n -v bash

stow 会在 $HOME 下为每个文件建软链,且能正确处理子目录(比如 vim/.vim/ftplugin/x.vim)。

五、新机器一键初始化

bash
# 一行命令(前提:仓库是公开的,或配好了 SSH key)
git clone https://github.com/you/dotfiles.git ~/dotfiles && ~/dotfiles/install.sh

# 或者用 bootstrap 脚本,连依赖一起装
curl -fsSL https://raw.githubusercontent.com/you/dotfiles/main/bootstrap.sh | bash

bootstrap.sh 示例:

bash
#!/usr/bin/env bash
set -euo pipefail

echo "==> 安装基础软件"
sudo apt update
sudo apt install -y git vim tmux curl rsync jq htop btop ncdu mtr stow

echo "==> 拉取 dotfiles"
if [ ! -d "$HOME/dotfiles" ]; then
  git clone https://github.com/you/dotfiles.git "$HOME/dotfiles"
fi

echo "==> 建立软链"
cd "$HOME/dotfiles" && stow bash vim git tmux

echo "==> 完成,请重新登录或 source ~/.bashrc"

六、敏感信息怎么处理

配置里难免有 token、公司内部地址。三种做法:

1. 拆分到本地文件(推荐)

bash
# ~/.bashrc 末尾
[ -f "$HOME/.bashrc.local" ] && source "$HOME/.bashrc.local"

.bashrc.local 不进仓库(写进 .gitignore),放 token 和机器特有配置。

2. 用环境变量

bash
export CF_TOKEN="${CF_TOKEN:-}"      # 从外部注入

3. 加密存储(git-crypt / gpg)

bash
sudo apt install -y git-crypt
cd dotfiles
git-crypt init
echo "secrets/* filter=git-crypt diff=git-crypt" > .gitattributes
git-crypt export-key ~/dotfiles-key   # 备份密钥

我的做法:仓库里只放通用配置,机器特有和敏感的内容全进 .local 文件。简单、不会误提交。

七、.gitconfig 里值得配的

bash
[user]
	name = 白泽
	email = user@example.com

[alias]
	st = status -sb
	co = checkout
	br = branch
	lg = log --oneline --graph --decorate -20
	diff = diff --word-diff
	undo = reset --soft HEAD~1

[core]
	autocrlf = input
	quotepath = false        # 中文文件名不转义

[init]
	defaultBranch = main

[pull]
	rebase = true

八、.bashrc 里值得留的别名

bash
alias ll="ls -alhF"
alias ..="cd .."
alias dfh="df -h | grep -vE '^tmpfs|overlay'"
alias ports="ss -lntp"
alias myip="curl -s ifconfig.me"
alias reload="source ~/.bashrc"

# 快速查看 journal
jlog() { journalctl -u "$1" -n 50 --no-pager; }

# 备份文件(而不是直接覆盖)
bk() { cp "$1" "$1.bak-$(date +%m%d)"; }

九、服务器上的 dotfiles

服务器上也可以配,但注意:

  • 保持最小:只放必要的别名和提示符,别搞复杂框架;
  • 多人共用的机器,改动会影响别人,谨慎;
  • root 和普通用户分别配置。
bash
# 服务器版 .bashrc 我通常只留这几行
export EDITOR=vim
alias ll="ls -alhF"
alias ports="ss -lntp"
alias dush="du -sh * | sort -rh | head"
PS1="[\u@\h \W]\$ "

十、维护建议

  • 每次改了配置顺手 commit,写清楚为什么改;
  • README 里写清楚依赖(比如需要装 stow、需要 fzf);
  • 不要在配置里写死公司/项目特有路径;
  • 半年整理一次,删掉不再用的别名。

dotfiles 的收益是复利:前期花两小时,之后每次重装系统省两小时。