用 Git 管理你的每日行程

2019-09-09 06:19:00

像原始碼一樣對待時間並在 Git 的幫助下維護你的日曆。

Git 是一個少有的能將如此多的現代計算封裝到一個程式之中的應用程式,它可以用作許多其他應用程式的計算引擎。雖然它以跟蹤軟體開發中的原始碼更改而聞名,但它還有許多其他用途,可以讓你的生活更輕鬆、更有條理。在這個 Git 系列中,我們將分享七種鮮為人知的使用 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 日曆應用程式進行日曆記錄的最大區別在於工作流程:你可以建立一個任務列表,然後每天分配一個任務,而不是轉到日曆並查詢要安排任務的日期。

組織模式中的列表使用星號(*)作為專案符號。這是我的遊戲任務列表:

* 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 characterSCHEDULED: <2019-03-22 18:00-19:00>** Read Stardrifter rulesSCHEDULED: <2019-03-22 19:00-21:00>** Stardrifter playtestSCHEDULED: <2019-03-25 0900-1300>** Blue Planet @ Mike'sSCHEDULED: <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$ lsGame.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 [[email protected]][14][remote]$ mkdir cal.git[remote]$ cd cal.git[remote]$ git init --bare[remote]$ exit

這個裸儲存庫可以作為你日曆在網際網路上的家。

將其設定為本地 Git 儲存庫(在你的計算機上,而不是你的伺服器上)的遠端源:

$ git remote add origin [email protected]:/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 帳戶的介面。如果你不這樣做,你的移動裝置將無法存取你的伺服器以存取你的日曆資料。

我是通過將我在 MGit 中生成的金鑰檔案通過 KDE Connect 複製到我的筆記型電腦來實現的(但你可以通過藍牙、SD 卡讀卡器或 USB 電纜進行相同操作,具體取決於你存取手機上的資料的首選方法)。 我用這個命令將金鑰(一個名為 calkey 的檔案)複製到我的伺服器:

$ cat calkey | ssh [email protected] "cat >> /home/seth/.ssh/authorized_keys"

你可能有不同的方法,但如果你曾經將伺服器設定為無密碼登入,這是完全相同的過程。如果你使用的是 GitLab 等託管的 Git 服務,則必須將金鑰檔案的內容複製並貼上到使用者帳戶的 SSH 金鑰面板中。

Adding key file data to GitLab

完成後,你的移動裝置可以向你的伺服器授權,但仍需要知道在哪裡查詢你的日曆資料。不同的應用程式可能使用不同的表示法,但 MGit 使用普通的舊式 Git-over-SSH。這意味著如果你使用的是非標準 SSH 埠,則必須指定要使用的 SSH 埠:

$ git clone ssh://[email protected]: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 的漢堡包選單選擇日程檢視。

Orgzly's agenda view

在 Orgzly 的“設定提醒”選單中,你可以選擇在手機上觸發通知的事件型別。你可以獲得 SCHEDULED 任務,DEADLINE 任務或任何分配了事件時間的任何通知。如果你將手機用作工作管理員,那麼你將永遠不會錯過 Org 模式和 Orgzly 的活動。

Orgzly notification

Orgzly 不僅僅是一個解析器。你可以編輯和更新事件,甚至標記事件為 DONE

Orgzly to-do list

專為你而設計

關於使用 Org 模式和 Git 的重要一點是,這兩個應用程式都非常靈活,並且你可以自定義它們的工作方式和內容,以便它們能夠適應你的需求。如果本文中的內容是對你如何組織生活或管理每週時間表的冒犯,但你喜歡此提案提供的其他部分,那麼請丟棄你不喜歡的部分。如果需要,你可以在 Emacs 中使用 Org 模式,或者你可以將其用作日曆標記。你可以將手機設定為在一天結束時從計算機上拉取 Git 資料,而不是從網際網路上的伺服器上,或者你可以將計算機設定為在手機插入時同步日曆,或者你可以每天管理它,就像你把你工作日所需的所有東西都裝到你的手機上一樣。這取決於你,而這是關於 Git、Org 模式和開源的最重要的事情。