我有多台电脑。我有一台工作用的笔记本电脑,一台家里的工作站,一台树莓派(或者四台),一台 Pocket CHIP,一台 运行各种 Linux 版本的 Chromebook,等等。我过去常常在每台电脑上或多或少地按照相同的步骤设置我的用户环境,而且我经常告诉自己,我喜欢每台电脑都略有不同。例如,我在工作时比在家时更频繁地使用 Bash 别名,而且我在家使用的辅助脚本在工作中可能没有用。
多年来,我对跨设备的期望开始趋于一致,我会忘记我在家用机器上构建的功能没有移植到我的工作机器上,等等。我需要一种方法来标准化我的自定义工具包。令我惊讶的是,答案是 Git。
Git 是版本跟踪软件。它以被最大和最小的开源项目甚至最大的专有软件公司使用而闻名。但它是为源代码设计的——而不是充满音乐和视频文件、游戏、照片等等的主目录。我听说过有人用 Git 管理他们的主目录,但我认为这只是编码人员进行的一个边缘实验,而不是像我这样的真实用户。
用 Git 管理我的主目录是一个不断发展的过程。我一路学习和适应。以下是你可能想要记住的事情,如果你决定用 Git 管理你的主目录。
1. 文本和二进制位置

(Seth Kenlon, CC BY-SA 4.0)
当由 Git 管理时,你的主目录变成了除了配置文件之外的所有东西的无人区。这意味着当你打开你的主目录时,你应该只看到一个可预测的目录列表。不应该有任何散落的照片或 LibreOffice 文档,也没有“我只是暂时把这个放在这里”的文件。
这样做的原因很简单:当你用 Git 管理你的主目录时,你的主目录中没有被提交的所有内容都会变成噪音。每次你执行 git status
时,你都必须滚动浏览 Git 没有跟踪的任何文件,因此至关重要的是,你要将这些文件保存在子目录中(你将这些子目录添加到你的 .gitignore
文件中)。
许多 Linux 发行版提供了一组默认目录
- 文档
- 下载
- 音乐
- 照片
- 模板
- 视频
如果需要,你可以创建更多。例如,我区分了我创作的音乐(音乐)和我购买来听的音乐(专辑)。同样,我的电影目录包含其他人的电影,而视频目录包含我需要编辑的视频文件。换句话说,我的默认目录结构比大多数 Linux 发行版提供的默认目录结构更精细,但我认为这样做是有好处的。如果没有一个适合你的目录结构,你更有可能只是把东西塞进你的主目录,因为找不到更好的地方放,所以提前考虑并计划出适合你的目录。你总是可以在以后添加更多,但最好从一开始就做好。
2. 设置你最好的 .gitignore
一旦你清理了你的主目录,你可以像往常一样将其实例化为一个 Git 仓库
$ cd
$ git init .
你的 Git 仓库目前是空的,所以你的主目录中的所有内容都是未跟踪的。你的首要任务是筛选未跟踪文件的列表,并确定你想保持未跟踪状态的文件。要查看未跟踪的文件
$ git status
.AndroidStudio3.2/
.FBReader/
.ICEauthority
.Xauthority
.Xdefaults
.android/
.arduino15/
.ash_history
[...]
根据你使用主目录的时间长短,此列表可能很长。容易处理的是你在第一步中决定的目录。通过将这些目录添加到名为 .gitignore
的隐藏文件中,你告诉 Git 停止将它们列为未跟踪文件,并且永远不要跟踪它们
$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore
完成此操作后,浏览 git status
显示的剩余未跟踪文件,并确定是否还有其他文件需要排除。这个过程帮助我发现了几个过时的旧配置文件和目录,我最终完全删除了它们,但也发现了一些特定于一台电脑的文件。我在这里非常严格,因为许多配置文件在自动生成时效果更好。例如,我从不提交我的 KDE 配置文件,因为许多配置文件包含诸如最近文档和其他元素之类的信息,这些信息在另一台机器上不存在。
我跟踪我的个性化配置文件、脚本和实用程序、配置文件和 Bash 配置,以及我经常参考的备忘单和其他文本片段。如果软件主要负责维护文件,我就忽略它。当对文件有疑问时,我也忽略它。你总是可以在以后取消忽略它(通过从你的 .gitignore
文件中删除它)。
3. 了解你的数据
我在使用 KDE,所以我使用开源扫描器 Filelight 来概览我的数据。Filelight 为你提供了一个图表,让你看到每个目录的大小。你可以浏览每个目录,查看是什么占用了所有空间,然后回溯到其他地方进行调查。这是一个关于你的系统的迷人视图,它让你以全新的视角看待你的文件。

(Seth Kenlon, CC BY-SA 4.0)
使用 Filelight 或类似的实用程序来查找你不需要提交的意外数据缓存。例如,KDE 文件索引器 (Baloo) 生成了大量特定于其主机的数据,我绝对不想将其传输到另一台计算机。
4. 不要忽略你的 .gitignore 文件
在某些项目中,我告诉 Git 忽略我的 .gitignore
文件,因为我想忽略的内容有时特定于我的工作目录,而且我不认为同一项目上的其他开发人员需要我告诉他们他们的 .gitignore
文件应该是什么样子。因为我的主目录仅供我个人使用,所以我不忽略我的主目录的 .gitignore
文件。我将其与其他重要文件一起提交,因此它可以在我的所有系统上继承。当然,从主目录的角度来看,我的所有系统都是相同的:它们具有相同的默认文件夹集和许多相同的隐藏配置文件。
5. 不要害怕二进制文件
我让我的系统经历了数周的严格测试,确信将二进制文件提交到 Git 永远不明智。我尝试了 GPG 加密密码文件、LibreOffice 文档、JPEG、PNG 等等。我甚至有一个脚本,可以在将 LibreOffice 文件添加到 Git 之前解压缩它们,提取内部的 XML 以便我可以只提交 XML,然后再重建 LibreOffice 文件,以便我可以在 LibreOffice 中处理它。我的理论是,提交 XML 会比 ZIP 文件(LibreOffice 文档实际上只是 ZIP 文件)生成更小的 Git 仓库。
令我非常惊讶的是,我发现偶尔提交几个二进制文件并没有实质性地增加我的 Git 仓库的大小。我已经使用 Git 足够长的时间,我知道如果我要提交千兆字节的二进制数据,我的仓库会受到影响,但偶尔的二进制文件并不是不惜一切代价都要避免的紧急情况。
有了这种新的信心,我将字体 OTF 和 TTF 文件添加到我的标准主仓库、我的 GDM 的 .face
文件以及其他偶然的次要二进制 Blob。不要想太多,不要浪费时间试图避免它;直接提交它。
6. 使用私有仓库
不要将你的主目录提交到公共 Git 仓库,即使主机提供私有帐户。如果你像我一样,你有 SSH 密钥和 GPG 密钥链以及 GPG 加密文件,这些文件不应该最终出现在任何人的服务器上,而只能出现在我自己的服务器上。
我在树莓派上 运行本地 Git 服务器(这比你想象的要容易),这样我就可以在我家里的任何时候更新任何电脑。我是一名远程工作者,所以这通常已经足够了,但我也可以在通过我的 VPN 旅行时访问电脑。
7. 记住要推送
关于 Git 的一点是,它只在你告诉它时才将更改推送到你的服务器。如果你是长期的 Git 用户,这个过程对你来说可能很自然。对于可能习惯于 Nextcloud 或 Syncthing 中的自动同步的新用户来说,这可能需要一些时间来适应。
家里的 Git
用 Git 管理我的常用文件不仅使跨设备的生活更加方便。知道我对所有配置和实用程序脚本都有完整的历史记录,这鼓励我尝试新想法,因为如果事实证明它们是坏主意,总是很容易回滚我的更改。Git 将我从 .bashrc
中不明智的 umask 设置、对我的软件包管理脚本的糟糕的深夜添加以及当时看起来很酷的想法——更改我的 rxvt 配色方案——以及可能是我过去的其他一些错误中解救出来。在你的家里尝试 Git,因为一个共同提交的家会融合在一起。
6 条评论