dotfiles 管理:换台机器五分钟恢复手感
每次重装系统都要重新配一遍 shell、vim、git,很浪费时间。把配置文件版本化,换机器就是一条命令的事。
一、哪些文件值得管
| 文件 | 内容 |
|---|---|
~/.bashrc / ~/.zshrc | shell 别名、函数、提示符 |
~/.vimrc | vim 配置 |
~/.gitconfig | 用户名、邮箱、别名 |
~/.tmux.conf | tmux 配置 |
~/.ssh/config | SSH 主机别名(注意不要放私钥) |
~/.inputrc | readline 行为 |
不要放进去的:私钥、含密码的文件、token。
二、结构
常见两种组织方式:
# 方式 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:创建软链接
#!/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 生效。"chmod +x install.sh && ./install.sh用软链接而不是复制:改仓库里的文件就等于改配置,反向同步不用做。
四、用 GNU stow(推荐)
stow 专门做这件事,能自动处理目录结构:
sudo apt install -y stow
cd ~/dotfiles
stow bash vim git tmux # 按目录名创建软链
stow -D bash # 撤销
stow -R vim # 重做(先撤再建)
# 预演:看会做什么
stow -n -v bashstow 会在 $HOME 下为每个文件建软链,且能正确处理子目录(比如 vim/.vim/ftplugin/x.vim)。
五、新机器一键初始化
# 一行命令(前提:仓库是公开的,或配好了 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 | bashbootstrap.sh 示例:
#!/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. 拆分到本地文件(推荐)
# ~/.bashrc 末尾
[ -f "$HOME/.bashrc.local" ] && source "$HOME/.bashrc.local".bashrc.local 不进仓库(写进 .gitignore),放 token 和机器特有配置。
2. 用环境变量
export CF_TOKEN="${CF_TOKEN:-}" # 从外部注入3. 加密存储(git-crypt / gpg)
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 里值得配的
[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 里值得留的别名
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 和普通用户分别配置。
# 服务器版 .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 的收益是复利:前期花两小时,之后每次重装系统省两小时。
