原文发布在我的个人小站:here
对于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 仓库。
mkdir ~/.mydotfiles
git init --bare ~/.mydotfiles
2. 创建命令别名
接下来需要创建一个命令别名来进行git的各种操作。直接在家目录运行git命令肯定是不行的,因为家目录不是一个 git repo,不包含 .git 文件夹。所以甚至命令别名如下:
alias config='/usr/bin/git --git-dir=$HOME/.mydotfiles/ --work-tree=$HOME'
像这样定义别名,是一种临时的方式。想要使它每次都生效,可以将其写入 .bashrc
或 .zshrc
.
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
文件:
#! $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
- Add the file in your .gitignore.
- Run the following: git rm --cached <file>
- 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
, 那就新建一个同名的远程仓库。然后
config remote add origin git@github.com:<username>/<repo_name>
config push -u origin master
就可以把本地仓库推送到远程,完成同步。
图片测试: