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

通过在 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 年发表的 点文件旨在被 Fork 这篇经典文章倡导共享点文件。这个前提至今仍然适用:我想与自己、点文件新手以及那些通过分享他们的自定义设置教会我很多东西的人分享它们。

共享点文件

我们中的许多人拥有多个系统,或者知道硬盘驱动器非常不可靠,以至于我们希望备份我们精心策划的自定义设置。我们如何在不同环境中保持这些精彩文件的同步?

我最喜欢的答案是分布式版本控制,最好是能够为我处理繁重工作的服务。我经常使用 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 Fork 的 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 (未验证)

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.