用 Git 來共用檔案

2020-01-10 11:38:00

SparkleShare 是一個開源的基於 Git 的 Dropbox 風格的檔案共用應用程式。在我們的系列文章中了解有關 Git 鮮為人知的用法。

Git 是一個少有的能將如此多的現代計算封裝到一個程式之中的應用程式,它可以用作許多其他應用程式的計算引擎。雖然它以跟蹤軟體開發中的原始碼更改而聞名,但它還有許多其他用途,可以讓你的生活更輕鬆、更有條理。在這個 Git 系列中,我們將分享七種鮮為人知的使用 Git 的方法。

今天,我們將看看 SparkleShare,它使用 Git 作為檔案共用的基礎。

用於檔案共用的 Git

Git 的優點之一是它具有固有的分發能力。它可用來建立共用。即使你只是與自己網路上的其他計算機共用資源庫,Git 也會為從共用位置獲取檔案的行為帶來透明性。

隨著其介面的發展,Git 變得非常簡單。雖然因使用者而異,他們坐下來完成一些工作時的共同點僅僅是 git pull 或稍微複雜一點的 git pull && git checkout -b my-branch。但是,對於某些人來說,將命令輸入到他們的計算機中的做法完全是令人困惑或煩惱的。計算機旨在使生活變得輕鬆,它擅長於重複性工作,因此有更簡便的方法可以與 Git 共用檔案。

SparkleShare

SparkleShare 專案是一個基於 Git 的跨平台的、開源的 Dropbox 式的檔案共用應用程式。它通過將檔案拖放到專門指定的 SparkleShare 目錄中的簡單操作,自動執行所有 Git 命令,觸發新增、提交、推播和拉取過程。因為它基於 Git,所以你可以獲得基於差異(diff)的快速推播和拉取,並且繼承了 Git 版本控制和後端基礎設施(如 Git 掛鉤)的所有優點。它可以完全自託管,也可以將其與 GitLab、GitHub、Bitbucket 等 Git 託管服務一起使用。此外,由於它基本上只是一個 Git 的前端,因此你可以在可能沒有 SparkleShare 用戶端但有 Git 用戶端的裝置上存取 SparkleShare 中的檔案。

正如你獲得 Git 的所有好處一樣,你也會受到所有常見的 Git 限制:使用 SparkleShare 儲存數百張照片、音樂和視訊是不切實際的,因為 Git 是為文字而設計和優化的。Git 當然可以儲存二進位制檔案的大檔案,但是因為它可以跟蹤歷史記錄,因此一旦將檔案新增到其中,幾乎就不可能完全刪除它。這在某種程度上限制了 SparkleShare 對某些人的實用性,但使其非常適合許多工作流程,包括日程安排

安裝 SparkleShare

SparkleShare 是跨平台的,可從網站獲得適用於 Windows 和 Mac 的安裝程式。對於 Linux,有一個 Flatpak 安裝包,或者你可以在終端中執行以下命令:

$ sudo flatpak remote-add flathub https://flathub.org/repo/flathub.flatpakrepo$ sudo flatpak install flathub org.sparkleshare.SparkleShare

建立一個 Git 儲存庫

SparkleShare 並不是軟體即服務(SaaS)。你在計算機上執行 SparkleShare 與 Git 儲存庫進行通訊,而 SparkleShare 並不儲存你的資料。如果你還沒有與資料夾同步的 Git 儲存庫,則必須在啟動 SparkleShare 之前建立一個資料夾。你有三個選擇:託管的 Git、自託管 Git 或自託管 SparkleShare。

託管的 Git

SparkleShare 可以使用你能存取的任何 Git 儲存庫進行儲存,因此,如果你擁有 GitLab 或任何其他託管服務的帳戶(或建立一個),則它可以成為 SparkleShare 的後端。例如,開源 Notabug.org 服務是一個類似於 GitHub 和 GitLab 的 Git 託管服務,但其獨特性足以證明 SparkleShare 的靈活性。根據使用者介面的不同,不同的託管服務建立新儲存庫的方法也有所不同,但是所有主要儲存庫都遵循相同的通用模型。

首先,在託管服務中找到建立新專案或儲存庫的按鈕,單擊它以開始。然後逐步完成儲存庫的建立過程,為儲存庫提供名稱、隱私級別(儲存庫通常預設為公共),以及是否使用 README 檔案初始化儲存庫。無論你是否需要個 README 檔案,請初始化建立一個。使用一個檔案來建立儲存庫不是絕對必要的,但是它會強制 Git 主機範例化儲存庫中的 master 分支,這有助於確保前端應用程式(例如 SparkleShare)具有要提交並推播的分支。即使檔案是幾乎空的 README 檔案,也可以用來檢視該檔案以確認你已連線成功。

Creating a Git repository

建立儲存庫後,獲取其用於 SSH 克隆的 URL。就像從 Git 專案獲得其 URL 一樣,你也可以獲取此 URL:導航至儲存庫頁面並查詢 “Clone” 按鈕或欄位。

Cloning a URL on GitHub

GitHub 的克隆 URL。

Cloning a URL on GitLab

GitLab 的克隆 URL。

這是 SparkleShare 用於獲取資料的地址,因此請記下它。你的 Git 儲存庫現已設定好。

自託管的 Git

你可以使用 SparkleShare 存取你有權存取的任何計算機上的 Git 儲存庫。除了一個 Git 裸儲存庫外,無需任何特殊設定。但是,如果你想將對 Git 儲存庫的存取權授予其他任何人,則應執行 Gitolite 之類的 Git 管理器或 SparkleShare 自己的 Dazzle 伺服器來幫助你管理 SSH 金鑰和帳戶。至少,建立一個特定於 Git 的使用者,以便有權存取你的 Git 儲存庫的使用者不會自動獲得對伺服器其餘部分的存取許可權。

以 Git 使用者身份登入伺服器(如果你非常擅長管理使用者和組許可權,則可以以自己的使用者登入)並建立儲存庫:

$ mkdir ~/sparkly.git$ cd ~/sparkly.git$ git init --bare .

你的 Git 儲存庫現已設定好。

Dazzle

SparkleShare 的開發人員提供了一個名為 Dazzle 的 Git 管理系統,以幫助你自託管 Git 儲存庫。

在你的伺服器上,將 Dazzle 應用程式下載到你的路徑中的某個位置:

$ curl https://raw.githubusercontent.com/hbons/Dazzle/master/dazzle.sh --output ~/bin/dazzle$ chmod +x ~/bin/dazzle

Dazzle 設定了一個特定於 Git 和 SparkleShare 的使用者,並且還基於 SparkleShare 應用程式生成的金鑰實現了存取許可權。現在,只需設定一個專案:

$ dazzle create sparkly

你的伺服器現在已經設定好,可以用作 SparkleShare 託管了。

設定 SparkleShare

首次啟動 SparkleShare 時,系統會提示你設定 SparkleShare 用於儲存的伺服器。這個過程可能看起來像一個首次執行的安裝嚮導,但實際上是在 SparkleShare 中設定新共用位置的通常過程。與許多共用驅動器應用程式不同,使用 SparkleShare 可以一次設定多個位置。你設定的第一個共用位置並不比你以後可以設定的任何共用位置更重要,並且你也不用註冊 SparkleShare 或任何其他服務。你只是將 SparkleShare 指向 Git 儲存庫,以便它知道如何使第一個 SparkleShare 資料夾保持同步。

在第一個螢幕上,給出一個身份資訊,SparkleShare 將在代表你進行的 Git 提交記錄中使用這些資訊。你可以使用任何內容,甚至可以使用不代表任何意義的偽造資訊。它僅用於提交訊息,如果你對審查 Git 後端進程沒有興趣,你可能甚至看不到它們。

下一個螢幕提示你選擇主機型別。如果你使用的是 GitLab、GitHub、Planio 或 Bitbucket,則可以選擇一個適當的。否則,請選擇“自己的伺服器”。

Choosing a Sparkleshare host

在此螢幕底部,你必須輸入 SSH 的克隆 URL。如果你是自託管的 Git,則地址類似於 <ssh://[email protected]>,而遠端路徑是為此目的而建立的 Git 儲存庫的絕對路徑。

根據上面的自託管範例,我虛構的伺服器的地址為 ssh://[email protected]:22122:22122 表示一個非標準的 SSH 埠),遠端路徑為 /home/git/sparkly.git

如果我改用 Notabug.org 帳戶,則上例中的地址為 ssh://[email protected],路徑為 seth/sparkly.git

SparkleShare 首次嘗試連線到主機時會失敗,因為你尚未將 SparkleShare 用戶端 ID(特定於 SparkleShare 應用程式的 SSH 金鑰)複製到 Git 主機。這是預料之中的,所以不要取消該過程。將 SparkleShare 設定視窗保持開啟狀態,並從系統工作列中的 SparkleShare 圖示處獲取用戶端 ID。然後將用戶端 ID 複製到剪貼簿,以便可以將其新增到 Git 主機。

Getting the client ID from Sparkleshare

將你的用戶端 ID 新增到託管的 Git 帳戶

除了較小的 UI 差異外,在任何託管服務上新增 SSH 金鑰(所有用戶端 ID 都是這樣)的過程基本上是相同的。在你的 Git 主機的 Web 儀表板中,導航到你的使用者設定,然後找到 “SSH 金鑰”類別。單擊“新增新金鑰”按鈕(或類似按鈕),然後貼上你的 SparkleShare 用戶端 ID 的內容。

Adding an SSH key

儲存金鑰。如果你希望其他人(例如共同作業者或家庭成員)能夠存取同一儲存庫,則他們必須向你提供其 SparkleShare 用戶端 ID,以便你可以將其新增到帳戶中。

將你的用戶端 ID 新增到自託管的 Git 帳戶

SparkleShare 用戶端 ID 只是一個 SSH 金鑰,因此將其複製並貼上到 Git 使用者的 ~/.ssh/authorized_keys 檔案中。

使用 Dazzle 新增你的客戶 ID

如果你使用 Dazzle 管理 SparkleShare 專案,請使用以下命令新增用戶端 ID:

$ dazzle link

當 Dazzle 提示你輸入該 ID 時,請貼上在 SparkleShare 選單中找到的用戶端 ID。

使用 SparkleShare

將用戶端 ID 新增到 Git 主機後,在 SparkleShare 視窗中單擊“重試”按鈕以完成設定。克隆儲存庫完成後,你可以關閉 SparkleShare 設定視窗,並在你的家目錄中找到一個新的 SparkleShare 資料夾。如果你設定了帶有託管服務的 Git 儲存庫,並選擇包括 README 檔案或許可證檔案,則可以在 SparkleShare 目錄中看到它們。

Sparkleshare file manager

此外,有一些隱藏目錄,你可以通過在檔案管理器中顯示隱藏目錄來檢視。

Showing hidden files in GNOME

使用 SparkleShare 的方式與使用計算機上任何目錄的方式相同:將檔案放入其中。每當將檔案或目錄放入 SparkleShare 資料夾時,它都會在後台複製到你的 Git 儲存庫。

排除某些檔案

由於 Git 從設計上就是要記住一切,因此你可能希望從記錄中排除特定的檔案型別。排除一些檔案是有原因的。通過定義擺脫 SparkleShare 管理的檔案,可以避免意外複製大檔案。你還可以為自己設計一種方案,使你可以將儲存在一個目錄中的邏輯上屬於同一個檔案(例如,MIDI 檔案及其 .flac 匯出檔案),但是可以自己手動備份大檔案,而同時讓 SparkleShare 備份基於文字的檔案。

如果在系統的檔案管理器中看不到隱藏的檔案,請顯示它們。導航到你的 SparkleShare 資料夾,然後到代表你的儲存庫的目錄,找到一個名為 .gitignore 的檔案,然後在文字編輯器中將其開啟。你可以在 .gitignore 中輸入副檔名或檔名(每行一個),任何與你列出的檔案匹配的檔案都會被忽略(如檔名所示)。

Thumbs.db$RECYCLE.BIN/.DS_Store._*.fseventsd.Spotlight-V100.Trashes.directory.Trash-**.wav*.ogg*.flac*.mp3*.m4a*.opus*.jpg*.png*.mp4*.mov*.mkv*.avi*.pdf*.djvu*.epub*.od{s,t}*.cbz

你知道最經常遇到哪些檔案型別,因此請集中精力處理最有可能潛入你的 SparkleShare 目錄的檔案。如果你想稍微矯枉過正一些,可以在 Notabug.org 以及整個網上找到 .gitignore 檔案的好集合。

通過將這些條目儲存在 .gitignore 檔案中,你可以將不需要傳送到 Git 主機的大檔案放在 SparkleShare 目錄中,SparkleShare 將完全忽略它們。當然,這意味著你需要確保它們可以備份或通過其他方式分發給你的 SparkleShare 共同作業者。

自動化

自動化 是我們與計算機達成的默契之一:計算機執行重複的、無聊的工作,而我們人類要麼不擅長做這些,要麼不擅長記憶這些。SparkleShare 是一種很好的、簡單的自動執行例行資料分發的方法。但不管怎麼說,這並不適合每個 Git 儲存庫。它沒有用於高階 Git 功能的介面,它沒有暫停按鈕或手動管理的操作。沒關係,因為它的使用範圍是有意限制的。SparkleShare 可以完成它計劃要做的事情,它做得很好,而且它是你無需關心的一個 Git 儲存庫。

如果你想使用這種穩定的、看不見的自動化,請嘗試一下 SparkleShare。