将你的点文件移动到版本控制

通过在 GitLab 或 GitHub 上共享点文件,备份或同步您在各个系统中的自定义配置。
450 位读者喜欢这个。
Filing papers and documents

通过我们称之为点文件的隐藏文件集合自定义您的操作系统,这真是令人兴奋的事情。在Shell 点文件可以为您做什么中,H. "Waldo" Grunenwald 详细介绍了设置点文件的原因和方法。让我们深入探讨共享它们的原因和方法。

什么是点文件?

“点文件”是我们机器上所有配置文件的常用术语。这些文件通常以文件名开头的 . 开头,例如 .gitconfig,并且操作系统通常默认情况下会隐藏它们。例如,当我在 MacOS 上使用 ls -a 时,它会显示所有原本不会在输出中显示的可爱点文件。

dotfiles on master
➜ ls
README.md  Rakefile   bin    	misc   	profiles   zsh-custom

dotfiles on master
➜ ls -a
.          	.gitignore 	.oh-my-zsh 	README.md  	zsh-custom
..         	.gitmodules	.tmux      	Rakefile
.gemrc     	.global_ignore .vimrc     	bin
.git       	.gvimrc    	.zlogin    	misc
.gitconfig 	.maid      	.zshrc     	profiles

如果我看一下其中一个,.gitconfig,我用它来 进行 Git 配置,我看到了大量的自定义设置。我有帐户信息、终端颜色首选项以及大量的别名,这些别名使我的命令行界面感觉像是我的。这是 [alias] 块中的一个片段

87   # Show the diff between the latest commit and the current state
88   d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat"
89
90   # `git di $number` shows the diff between the state `$number` revisions ago and the current state
91   di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d"
92
93   # Pull in remote changes for the current repository and all its submodules
94   p = !"git pull; git submodule foreach git pull origin master"
95
96   # Checkout a pull request from origin (of a github repository)
97   pr = !"pr() { git fetch origin pull/$1/head:pr-$1; git checkout pr-$1; }; pr"

由于我的 .gitconfig 有超过 200 行的自定义设置,我没有兴趣在我使用的每台新计算机或系统上重写它,其他人也没有。这是共享点文件变得越来越流行的原因之一,尤其是在社交编码网站 GitHub 兴起之后。倡导共享点文件的经典文章是 Zach Holman 2008 年的 Dotfiles Are Meant to Be Forked。这个前提至今仍然适用:我想与自己、点文件新手以及那些通过分享他们的自定义设置教会我很多的人分享它们。

共享点文件

我们中的许多人拥有多个系统,或者知道硬盘是不可靠的,因此我们 想要备份我们精心策划的自定义设置。我们如何使这些出色的文件在不同环境中保持同步?

我最喜欢的答案是分布式版本控制,最好是能够为我处理繁重工作的服务。我经常使用 GitHub,并且随着经验的增长,我继续享受 GitLab。两者都是共享信息的完美场所。要进行设置

  1. 登录您首选的基于 Git 的服务。
  2. 创建一个名为“dotfiles”的存储库。(使其公开!分享是一种关怀。)
  3. 将其克隆到您的本地环境。*
  4. 将您的点文件复制到该文件夹中。
  5. 将它们符号链接(symlink)回其目标文件夹(通常是 $HOME)。
  6. 将它们推送到远程存储库。

* 您可能需要设置您的 Git 配置命令来克隆存储库。GitHub 和 GitLab 都会提示您要运行的命令。

Creating a new project on GitLab

上面的步骤 4 是这项工作的关键,可能有点棘手。无论您是使用脚本还是手动操作,工作流程都是从您的点文件文件夹符号链接到点文件目标,以便对您的点文件进行的任何更新都可以轻松推送到远程存储库。要对我的 .gitconfig 文件执行此操作,我将输入

$ cd dotfiles/
# Be sure to adjust the user to your user, which you can
# find in the path or by running the following: 
$ echo $USER
mbbroberg
$ pwd
/Users/mbbroberg/Develop/dotfiles
# Be sure to use an absolute path
$ ln -nfs /Users/mbbroberg/Develop/.gitconfig /Users/mbbroberg/.gitconfig

添加到符号链接命令的标志提供了一些额外的好处

  • -s 创建符号链接而不是硬链接
  • -f 在发生错误时继续进行其他符号链接(此处不需要,但在循环中很有用)
  • -n 避免符号链接符号链接(与 ln 其他版本的 -h 相同)

如果您想更深入地了解可用参数,您可以查看 IEEE 和 Open Group ln 规范以及 MacOS 10.14.3 上的版本。我不得不查找这些标志,因为我从别人的点文件中提取了它们。

您还可以使用一些额外的代码使更新更简单,例如我从 Brad Parbs 分叉的 Rakefile。或者,您可以像 Jeff Geerling 在 他的点文件中所做的那样,使其非常简单。他使用 这个 Ansible playbook 符号链接文件。此时保持一切同步很容易:您可以从您的点文件文件夹中进行 cron 作业或偶尔 git push

题外话:什么不应该共享

在我们继续之前,值得注意的是,您应该添加到共享点文件存储库中的内容——即使它以点开头。任何存在安全风险的东西,例如 .ssh/ 文件夹中的文件,都不是使用此方法共享的好选择。在将配置文件发布到网上之前,请务必仔细检查,并三重检查您的文件中是否没有 API 令牌。

我应该从哪里开始?

如果 Git 对您来说是新的,我的 关于术语的文章我最常用的命令的速查表 应该可以帮助您入门。

还有其他令人难以置信的资源可以帮助您开始使用点文件。多年前,我偶然发现了 dotfiles.github.io,并且继续回到它,以便更广泛地了解人们正在做什么。其他人的点文件中隐藏着大量的部落知识。花时间浏览一些,并且不要羞于将它们添加到您自己的点文件中。

我希望这将帮助您开始享受在您的计算机上拥有一致的点文件的乐趣。

您最喜欢的点文件技巧是什么?添加评论或在 Twitter 上给我发推文 @mbbroberg

标签
I'm happiest at a microphone
Matt 曾是 EMC 存储专家、VMware vExpert 以及其他专有技术的忠实拥护者。他现在专注于开源和 DevRel 采用。

7 条评论

一篇有趣的文章,Matt,谢谢!我很高兴看到“什么不应该共享”。

虽然我的大多数点文件都没有秘密,但正如您所指出的,有些点文件确实有秘密——例如 .ssh、.gnupg、.local/share 等等……可能还有其他一些。考虑到这一点,我的点文件有点像我的袜子抽屉——里面有很多可用的袜子,但不确定我是否想分享它们!无论如何,这是一个很棒的想法。

与其链接您的点文件,不如尝试一下 YADM:https://yadm.io

它包装了 git 命令,并将实际的 git 存储库保存在子目录中。

看看 https://github.com/twpayne/chezmoi。它还允许您安全地存储秘密。免责声明:我是 chezmoi 的作者。

与其保留在单体和过载的存储库上,不如使用 vcsh 分割存储库更有意义:https://github.com/RichiH/vcsh

这还具有额外的优势,例如,允许您拆分工作和个人 SSH 配置等。

在我的 mac 上,当我尝试使用 `ln -nfs .gitconfig $HOME/.gitconfig` 从我的点文件目录符号链接我的 .gitconfig 时,我最终在我的主目录中得到了 `/Users/bjorn/.gitconfig -> ./.gitconfig`,这实际上是链接到自身,并且完全破坏了 git。使用完整路径(例如 `ln -nfs ~/dotfiles/.gitconfig ~/.gitconfig`)做对了,并给了我 `/Users/bjorn/.gitconfig -> /Users/bjorn/dotfiles/.gitconfig`

我认为这里存在一个错误,原因是当我们需要绝对路径时使用了相对路径。我们希望两个路径都像您上面显示的那样是绝对路径。我现在就纠正这一点——感谢您提出这个问题!

回复 作者:Bjorn(未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.