使用 Git 管理您的日常日程

像对待源代码一样对待时间,并在 Git 的帮助下维护您的日历。
209 位读者喜欢这个。

Git 是少数几个能够将现代计算的许多方面封装到一个程序中的应用程序之一,以至于它最终成为许多其他应用程序的计算引擎。虽然它最出名的是跟踪软件开发中的源代码更改,但它还有许多其他用途,可以使您的生活更轻松、更有条理。在本系列文章中,我们将迎来 Git 成立 14 周年(4 月 7 日),我们将分享七种鲜为人知的 Git 用法。今天,我们将探讨如何使用 Git 来跟踪您的日历。

使用 Git 跟踪您的日程安排

如果时间本身就是可以管理和版本控制的源代码,会怎么样?虽然证明或证伪这种理论可能超出了本文的范围,但事实是您可以像对待源代码一样对待时间,并在 Git 的帮助下管理您的日常日程。

日历管理的卫冕冠军是 CalDAV 协议,它驱动着流行的开源日历应用程序,如 NextCloud 以及流行的闭源应用程序。CalDAV 没有什么问题(评论者,请注意)。但它并不适合所有人,而且除了单一文化之外,没有什么比这更缺乏启发性的了。

因为我对投资主要依赖 GUI 的 CalDAV 客户端没有兴趣(尽管如果您正在寻找一个好的终端 CalDAV 查看器,请参阅 khal),所以我开始研究基于文本的替代方案。基于文本的日历管理具有在 纯文本 中工作的所有常见好处。它轻量级、高度便携,并且只要结构化,就很容易解析和美化(无论对您意味着什么)。

最棒的是,这正是 Git 设计用于管理的内容。

Org 模式,但不可怕

如果您不对纯文本施加结构,它很快就会陷入即兴想法和随意的符号的混乱之中。幸运的是,存在一种用于日历管理的标记语法,它包含在久负盛名的 Emacs 生产力模式 Org 模式 中(承认吧,您一直想开始使用它)。

关于 Org 模式最令人惊奇的事情是,许多人没有意识到 您不需要知道甚至不需要使用 Emacs 即可利用 Org 模式建立的约定。如果您确实使用 Emacs,您会获得许多很棒的功能,但如果 Emacs 让您感到害怕,那么您可以实现基于 Git 的 Org 模式日历系统,甚至无需安装 Emacs。

您唯一需要了解的 Org 模式部分是其语法。Org 模式语法维护成本低且相当直观。使用 Org 模式而不是 GUI 日历应用程序进行日历管理的最大区别在于工作流程:您不是转到日历并找到要安排任务的日期,而是创建一个任务列表,然后为每个任务分配日期和时间。

Org 模式中的列表使用星号 (*) 作为项目符号。这是我的游戏任务列表:

* Gaming
** Build Stardrifter character
** Read Stardrifter rules
** Stardrifter playtest

** Blue Planet @ Mike's

** Run Rappan Athuk
*** Purchase hard copy 
*** Skim Rappan Athuk
*** Build Rappan Athuk maps in maptool
*** Sort Rappan Athuk tokens

如果您熟悉 CommonMark 或 Markdown,您会注意到 Org 模式没有使用空格来创建子任务,而是更明确地使用额外的项目符号。无论您在列表方面的背景如何,这都是构建列表的一种直观且简单的方法,而且显然它并非天生就与 Emacs 绑定(尽管使用 Emacs 为您提供了快捷方式,以便您可以快速重新排列列表)。

要将您的列表转换为日历中的计划任务或事件,请返回并添加关键字 SCHEDULED 和可选的 :CATEGORY:

* Gaming
:CATEGORY: Game
** Build Stardrifter character
   SCHEDULED: <2019-03-22 18:00-19:00>
** Read Stardrifter rules
   SCHEDULED: <2019-03-22 19:00-21:00>
** Stardrifter playtest
   SCHEDULED: <2019-03-25 0900-1300>
** Blue Planet @ Mike's
   SCHEDULED: <2019-03-18 18:00-23:00 +1w>

and so on...

SCHEDULED 关键字将条目标记为您希望收到通知的事件,可选的 :CATEGORY: 关键字是供您自己使用的任意标记系统(在 Emacs 中,您可以根据类别对条目进行颜色编码)。

对于重复事件,您可以使用诸如 +1w 创建每周事件或 +2w 创建每两周事件等表示法,依此类推。

Org 模式可用的所有高级标记都已 记录在案,因此请随时查找更多技巧来帮助它满足您的需求。

将其放入 Git

如果没有 Git,您的 Org 模式约会只是您本地计算机上的一个文件。但现在是 21 世纪,所以您至少需要在手机上拥有日历,如果不是在您的所有个人计算机上。您可以使用 Git 为自己和他人发布您的日历。

首先,为您的 .org 文件创建一个目录。我将我的文件存储在 ~/cal 中。

$ mkdir ~/cal

更改到您的目录并使其成为 Git 仓库

$ cd cal
$ git init

将您的 .org 文件移动到您的本地 Git 仓库。在实践中,我为每个类别维护一个 .org 文件。

$ mv ~/*.org ~/cal
$ ls
Game.org  Meal.org  Seth.org  Work.org

暂存并提交您的文件

$ git add *.org
$ git commit -m 'cal init'

创建一个 Git 远程仓库

要使您的日历可以从任何地方访问,您必须在互联网上拥有一个 Git 仓库。您的日历是纯文本,因此任何 Git 仓库都可以。您可以将您的日历放在 GitLab 或任何其他公共 Git 托管服务(甚至是专有的服务)上,并且只要您的主机允许,您甚至可以将仓库标记为私有。如果您不想将您的日历发布到您不控制的服务器上,那么自己托管一个 Git 仓库很容易,可以使用裸仓库供单个用户使用,也可以使用前端服务,如 GitoliteGitea

为了简单起见,我将假设一个自托管的裸 Git 仓库。您可以使用一个 Git 命令在您拥有 SSH 访问权限的任何服务器上创建一个裸远程仓库

$ ssh -p 22122 seth@example.com
[remote]$ mkdir cal.git
[remote]$ cd cal.git
[remote]$ git init --bare
[remote]$ exit

这个裸仓库可以作为您日历在互联网上的家。

将其设置为您的本地(在您的计算机上,而不是您的服务器上)Git 仓库的远程源

$ git remote add origin seth@example.com:/home/seth/cal.git

然后将您的日历数据推送到服务器

$ git push -u origin HEAD

通过将您的日历放在 Git 仓库中,您可以在任何运行 Git 的设备上访问它。这意味着您可以对您的日程安排进行更新和更改,并将您的更改向上游推送,以便在所有地方更新。

我使用这种方法在我的工作笔记本电脑和我的家用工作站之间保持日历同步。由于我每天的大部分时间都使用 Emacs,因此能够在 Emacs 中查看和编辑我的日历非常方便。对于大多数拥有移动设备的人来说也是如此,因此下一步是在移动设备上设置 Org 模式日历系统。

移动 Git

由于您的日历数据是纯文本,严格来说,您可以在任何可以读取文本文件的设备上“使用”它。这是该系统的一部分美妙之处;您永远不会至少没有您的原始数据。但是,要像您期望的现代日历那样在移动设备上集成您的日历,您需要两个组件:移动 Git 客户端和移动 Org 模式查看器。

移动 Git 客户端

MGit 是一个适用于 Android 的优秀 Git 客户端。也有适用于 iOS 的 Git 客户端。

安装 MGit(或类似的 Git 客户端)后,您必须克隆您的日历仓库,以便您的手机拥有一个副本。要从您的移动设备访问您的服务器,您必须设置一个 SSH 密钥进行身份验证。MGit 可以为您生成和存储密钥,您必须将其添加到服务器的 ~/.ssh/authorized_keys 文件或托管 Git 帐户设置中的 SSH 密钥中。

您必须手动执行此操作。MGit 没有登录到您的服务器或托管 Git 帐户的界面。如果您不这样做,您的移动设备将无法访问您的服务器来访问您的日历数据。

我通过使用 KDE Connect 将我在 MGit 中生成的密钥文件复制到我的笔记本电脑上来完成的(但您可以使用蓝牙、SD 卡读卡器或 USB 电缆来完成相同的操作,具体取决于您首选的访问手机数据的方法)。我使用以下命令将密钥(一个名为 calkey 的文件)复制到我的服务器:

$ cat calkey | ssh seth@example.com "cat >> /home/seth/.ssh/authorized_keys"

您可能有不同的方法来完成它,但如果您曾经为您的服务器设置无密码登录,这完全是相同的过程。如果您使用的是像 GitLab 这样的托管 Git 服务,您必须将您的密钥文件的内容复制并粘贴到您的用户帐户的 SSH 密钥面板中。

Adding key file data to GitLab

完成后,您的移动设备可以授权访问您的服务器,但它仍然需要知道去哪里找到您的日历数据。不同的应用程序可能使用不同的表示法,但 MGit 使用普通的 Git-over-SSH。这意味着如果您使用非标准的 SSH 端口,您必须指定要使用的 SSH 端口

$ git clone ssh://seth@example.com:22122//home/seth/git/cal.git

Specifying SSH port in MGit

如果您使用不同的应用程序,它可能会使用不同的语法,允许您在特殊字段中提供端口或删除 ssh:// 前缀。如果您遇到问题,请参阅应用程序文档。

将仓库克隆到您的手机。

Cloned repositories

很少有 Git 应用程序设置为自动更新仓库。您可以使用一些应用程序来自动化拉取,或者您可以设置 Git 钩子从您的服务器推送更新,但我不会在这里深入探讨。现在,在您更新日历后,请务必在 MGit 中手动拉取新更改(或者如果您在手机上更改事件,请将更改推送到您的服务器)。

MGit push/pull settings

移动日历

有一些不同的应用程序为移动设备上的 Org 模式提供前端。 Orgzly 是一个很棒的开源 Android 应用程序,它为 Org 模式最强大的功能(从 Agenda 模式到 TODO 列表)提供了一个界面。安装并启动它。

从主菜单中,选择设置 同步仓库 并选择包含您的日历文件的目录(即,您从服务器克隆的 Git 仓库)。

给 Orgzly 一点时间来导入数据,然后使用 Orgzly 的 汉堡菜单 选择 Agenda 视图。

Orgzly's agenda view

在 Orgzly 的设置 提醒菜单中,您可以选择哪些事件类型触发手机上的通知。您可以获得 SCHEDULED 任务、DEADLINE 任务或任何分配了事件时间的任务的通知。如果您将手机用作任务主管,您将永远不会错过 Org 模式和 Orgzly 的任何事件。

Orgzly notification

Orgzly 不仅仅是一个解析器。您可以编辑和更新事件,甚至可以将事件标记为 DONE

Orgzly to-do list

为您设计和由您设计

理解使用 Org 模式和 Git 的重要之处在于,这两个应用程序都非常灵活,并且期望您自定义它们的工作方式和内容,以便它们适应您的需求。如果本文中的某些内容冒犯了您组织生活或管理每周日程的方式,但您喜欢此提案的其他部分,那么请抛弃您不喜欢的部分。如果您愿意,您可以在 Emacs 中使用 Org 模式,或者您可以仅将其用作日历标记。您可以设置您的手机在一天结束时直接从您的计算机而不是互联网上的服务器拉取 Git 数据,或者您可以配置您的计算机在您的手机插入时同步日历,或者您可以每天在将您的手机装满工作日所需的所有东西时管理它。这取决于您,这是关于 Git、关于 Org 模式以及关于开源的最重要的事情。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时进行。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.