我是说点文件,不是让你点文件
前言#
使用 OS 跳板机,为了上机时更高的效率,大家总是会想着能不能配置好自己的环境。然而 OS 一结束跳板机一回收,这些配置也就消失了,我觉得非常可惜。参考之前看过的一些仓库,我们可以对自己家目录下的配置文件进行版本管理,并上传到 GitHub 远程仓库以保存。
我的 dotfiles#
展示出我的配置以供大家参考,已经上传到 GitHub 上,这样我其他的机子都可以共享使用。详见 tangsongxiaoba/dotfiles。
首先我们可以发现,大部分家目录下的配置文件都是以 . 开头的。这是因为以 . 开头的文件和文件夹默认是隐藏的,除非你在 ls 的时候加入 -a 参数。于是我们可以着重管理这些文件。常见的配置文件有:
.bashrc是用户登录到系统时自动执行的脚本。在 OS 跳板机上叫做.bash_profile,此外 Linux 中还有其他登录时自动执行的脚本,我并没有系统学习过,有了解过的大佬还请教教我 orz.vimrc是用户对vim的配置文件。.tmux.conf是用户对tmux的配置文件。.ssh/是用户存储的ssh登录相关的密钥等目录。我不知道对.ssh/进行版本管理会不会有什么隐私风险,所以没有去管理它。.config/是用户存储的一些常用配置文件等目录,也许并不存在。
我的这份配置是这样工作的:
- 在 
dotfiles/目录下创建一个不含.的文件或者文件夹,比如要管理~/.vimrc,就创建一个vimrc;要管理~/.config/,就创建一个config/。至于为什么要去掉.,我想的是,带.的文件应该是配置文件等,不带.的文件应该是需要显式管理的文件。 - 运行 
run.sh。这会将dotfiles/复制到$HOME/.dotfiles/(覆盖),然后自动将$HOME/.dotfiles/下的所有非隐藏的文件和文件夹链接到家目录下对应的隐藏文件和文件夹。也就是说,对于每个应链接的文件/文件夹,执行ln -sf /path/to/xxx ~/.xxx - 创建一个 
.ignore文件以管理需要被忽略的文件。因为这是一个项目,应有一份 README,而README.md文件是我们不希望链接到家目录下的。因此,在.ignore和.ignore.local文件中添加的项则不会进行链接。.ignore.local是被.gitignore忽略了的,因此不会被上传到 Git 中,作为本地配置。 - 在链接文件夹的过程中会先检查该文件夹下是否有 
init.sh,若有则会先执行再链接。目前这个做法是为了给bin/目录下的可执行文件赋予可执行权限。 
这里进行配置的关键文件是项目根目录下的 run.sh 脚本。这脚本一部分是我自己写的,一(大)部分是 AI 生成的。bash 还是太难写了(
bin/ 目录下的 init.sh 会将该目录下所有的文件进行检测,如果是可执行文件/脚本则赋予 755 权限。run.sh 会自动检测每个目录下是否存在 init.sh,并会在链接之前先行执行它。
目前这份脚本在我的跳板机上、我的 WSL 上和我自己的 Linux 机器上都可以正常运行,如果有虫欢迎来捉(orz
跳板机部署方法#
注意,进行如下操作时请先备份好你自己的配置文件!!!!!!!!!!
我的脚本是强制覆盖家目录下的对应配置文件的,请先备份!!!!!!!
在网页端,我们可以通过“文件管理”对跳板机的文件进行上传/下载。“文件管理”进行上传/下载的目录是跳板机下的 /2337xxxx 目录,对应我们各自的学号。我们可以把这个项目上传到跳板机,然后 cd /2337xxxx/dotfiles,并在该目录下执行 bash run.sh,会自动将整个文件夹复制到家目录下的 .dotfiles/,并对文件夹中的所有配置文件(夹)进行链接。
然而,如果你像我一样进行版本管理的是 bashrc 而非 bash_profile(窃以为前者比后者更常见),跳板机并不会在登录时自动执行 .bashrc 文件,而是自动执行 .bash_profile 文件。为此,可以执行 ln -sf ~/.bashrc ~/.bash_profile 来链接 bashrc 文件。
后续改进#
- 可以考虑怎么管理 
.ssh/等具有隐私信息的文件或目录。 - 可以更进一步,考虑使用声明式配置的方法对整个 OS 进行管理,所谓 
OS as Code。参考 NixOS。 
