管理自己的配置文件

0 起因

Linux 下面会有大量的配置文件,他们多是以.开头的隐藏文件,放置在HOME下面,后者~/.config/文件夹下面,如果需要在多台电脑上保持这些配置文件的一致,可以使用git的办法去管理,这里用到了一个git的特殊用法。

1 建立 bara 的仓库

1
2
3
4
git init --bare $HOME/.dotconfig
alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'
dotconfig config --local status.showUntrackedFiles no
echo "alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'" >> $HOME/.bashrc

2 添加需要管理的dot files

1
2
3
4
5
6
dotconfig status
dotconfig add .config/lvim/config.lua
dotconfig commit -m "Add lvim config.lua"
dotconfig add .bashrc
dotconfig commit -m "Add bashrc"
dotconfig push

3 github 上建立名为 dotconfig 的仓库,并在本地设置 remote 地址

1
2
3
git remote add origin https://github.com/zhydong258/dotconfig.git
git branch -M main
git push -u origin main

4 在新的电脑上同步

4.1 clone 到本地

1
2
3
4
5
git clone --bare https://github.com/zhydong258/dotconfig.git $HOME/.dotconfig
alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'
dotconfig checkout
dotconfig config status.showUntrackedFiles no
echo "alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'" >> $HOME/.bashrc

4.2 脚本的形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
git clone --bare https://github.com/zhydong258/dotconfig.git $HOME/.dotconfig
function dotconfig {
/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME $@
}
mkdir -p .dotconfig-backup
dotconfig checkout
if [ $? = 0 ]; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
dotconfig checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .dotconfig-backup/{}
fi;
dotconfig checkout
dotconfig config status.showUntrackedFiles no

其中,$?中存储的是上个命令执行的结果,如果成功返回0,如果失败,则返回值非0。这里上一条命令是dotconfig checkout,如果出现类似如下错误,表明本地目录已经有文件存在了。

1
2
3
4
5
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
Aborting

在后续的else中,这些已经存在的文件会移动到.dotconfig-backup文件夹里面。