Manage Dotfiles by Git

对于Linux用户,在 $HOME 文件夹下,一般都有大量的隐藏文件,形如.conf,.xxxrc等,这些都是程序的配置文件。很多人也许花了一个下午,一天,甚至一个星期,折腾某某程序的配置文件。如果这些轻易丢失了,那就是浪费生命了!所以,如何将这些文件备份,成了很多人必须要问的一个问题。

之前我就一直没有备份的意识。结果无论是重装系统,还是转移机器,都十分煎熬,很多软件都需要重新配置!这可是一个浩大的工程,费时费力还费心。于是终于想起来应该把苦心经营(大部分都是来自网络资源,然后自己改改)的配置文件给备份一下。

于是在网上搜索了一下,发现很多人都用 Github 备份自己的配置文件。于是便尝试如下:

常规操作是将所有需要备份的配置文件单独拎出来,放到一个专用文件夹MyConf下,该文件夹就作为 git repo 的根目录。然后将配置文件链接到需要原本需要它们的文件夹下。这应该是个比较不错的解决方案了,但是有的人可能不喜欢创建软链,很强迫症○| ̄|_

于是就有了接下来的方法:主要思想是使用家目录$HOME下的一个文件夹存储一个 Git bare repository (关于bare repo 和 普通repo的区别参见What is a bare git repository?)。 然后使用命令别名去添加,删除,修改配置文件,这样做的好处是不需要在家目录下创建 .git/ 目录,否则会干扰其他子目录的 git 操作。

1. 新建 bare 仓库

$HOME文件夹下新建一个文件夹用来存放 git 版本树。然后初始化为 bare 仓库。

1
2
mkdir ~/.mydotfiles
git init --bare ~/.mydotfiles

2. 创建命令别名

接下来需要创建一个命令别名来进行git的各种操作。直接在家目录运行git命令肯定是不行的,因为家目录不是一个 git repo,不包含 .git 文件夹。所以甚至命令别名如下:

1
alias config='/usr/bin/git --git-dir=$HOME/.mydotfiles/ --work-tree=$HOME'

像这样定义别名,是一种临时的方式。想要使它每次都生效,可以将其写入 .bashrc.zshrc.

1
echo "alias config='/usr/bin/git --git-dir=$HOME/.mydotfiles/ --work-tree=$HOME'" >> $HOME/.bashrc

如此一来,每次进入shell,都可以使用这个别名。可以敲一个 config status看看效果。

3. 使用.gitignore

现在我们的工作目录是整个家目录,如果要把整个目录全备份的话,那就太可怕了。家目录一般动辄十几甚至几十个Gb,没有哪家免费服务可以让你把整个家目录都备份的。所以我们需要一个 .gitignore 文件。Git 会主动忽略.gitignore中所匹配的那些文件。在家目录中创建(如果没有).gitignore 文件:

1
2
3
4
5
6
7
8
9
10
11
12
#! $HOME/.gitignore

#----[ ignore all ] -----
*
#---[ consider list ]---
!*.[Xx]resources
!*.conf
!*config*
!*[a-zA-Z]*rc
!.config/
!.config/*
#---[ ignore list ]---

上面的文件告诉 git 默认忽略所有文件及文件夹,然后反向添加我们想要考虑的那些文件或文件夹。关于该文件的匹配规则参见explain gitignore pattern matching - Stack Overflow. 另外gitignore.io可以根据要求生成不同的 .gitignore 文件。

忽略特定文件

Permanently ignore changes to a file

  1. Add the file in your .gitignore.
  2. Run the following: git rm --cached <file>
  3. Commit the removal of the file and the updated .gitignore to your repo.

来自谷歌搜索,巨婴家Doc.

4. 常规 git 操作

现在你可以用config add -A来添加所有匹配到的文件。如之前的配置,可以匹配大部分的配置文件。如有遗漏,可以用config add -f <file> 来强制添加。然后可以 config commit -m "initial git" 来提交更改。最后连接 github 远程仓库。

首先在github网站新建一个同名仓库。比如本地仓库为.mydotfiles, 那就新建一个同名的远程仓库。然后

1
2
config remote add origin git@github.com:<username>/<repo_name>
config push -u origin master

就可以把本地仓库推送到远程,完成同步。

图片测试:
animal-blurred-background-cat-1443710

Reference

Author: Yychi
Link: https://guyueshui.github.io/blog_archive/2018/11/Manage-Dotfiles-by-Git/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
微信:我很贫穷(*/ω\*)
支付宝:请给我钱(╬ Ò ‸ Ó)