跳至內容

連接程式碼託管

Control Center 支援三個程式碼託管平台,應用程式中一律稱為託管平台:GitHub、GitLab 和 Bitbucket Cloud。三者都不是預設選項。連接其中一個,一切就能運作;連接多個,同一個工作區便能同時容納來自它們全部的程式庫。

託管平台是每個程式庫的一項屬性,在你註冊該程式庫時從它的 origin 遠端讀取。你永遠不需要挑選,也沒有任何按工作區劃分的設定可以出錯。

  1. 開啟 設定 → 工作區 → 個人資料與身分(/settings/workspace/profile)。
  2. 找到 程式碼託管 卡片。所有支援的託管平台都會列出,無論是否已連接。
  3. 若該列提供 使用 … 登入,就按下它;否則按 新增權杖,再貼上一個權杖。

登入只會出現在你的伺服器已為其註冊應用程式的託管平台上 —— 目前就是 GitHub,經由裝置流程(見建立 GitHub App)。其他一律是貼上的權杖,這是誠實的操作方式,而不是一顆無法完成的按鈕。

不論哪一種,憑證都是你的,並且存放在伺服器上,以你的使用者 id 為鍵:你輸入權杖的那部機器不會儲存任何權杖,你登入的每部裝置都使用同一個權杖,其他成員也讀不到。它會在下一個請求生效 —— 沒有東西需要重新啟動,而中斷連接後,它就會立即停止被送出。

每一列都會告訴你它的憑證來自哪裏,因為那正是「我的權杖沒有生效」與「回答的是另一個權杖」之間的差別:

副標題 含義
Signed in as octocat 正在使用你自己的憑證
Signed in as octocat · via this server's app 回答的是伺服器的應用程式身分 —— 你尚未登入
Signed in as octocat · from the environment 回答的是伺服器環境變數,而不是你的憑證
Not connected 你沒有這個託管平台的憑證
託管平台 權杖 在哪裏建立
GitHub Classic:repo 與 read:org。Fine-grained:Contents + Pull requests(讀寫)、Checks + Actions(讀取) github.com → Settings → Developer settings → Tokens
GitLab 具備 api 的個人存取權杖 gitlab.com → User settings → Access tokens
Bitbucket Atlassian API 權杖,加上你的帳戶電郵 id.atlassian.com → Security → API tokens

Bitbucket 以你的帳戶電郵作為使用者名稱、以權杖作為密碼來驗證。請在伺服器環境中設定 BITBUCKET_EMAIL,它才知道要讓哪個電郵與該權杖配對。

對於無介面或 CI 安裝,伺服器會讀取這些:

  • GitHub — GITHUB_TOKEN,然後 GH_TOKEN
  • GitLab — GITLAB_TOKEN,然後 CI_JOB_TOKEN
  • Bitbucket — BITBUCKET_API_TOKEN,然後 BITBUCKET_TOKEN(連同 BITBUCKET_EMAIL)

這些是伺服器的憑證,而不是你的,而且這個區別至關重要:以你的名義發出的請求只會使用你的憑證,不會用其他任何東西,所以環境永遠不會悄悄代替你。沒有人類在背後的工作 —— webhook、PR 輪詢、工單同步 —— 會先解析伺服器的應用程式身分,然後是伺服器擁有者的憑證,最後才是環境。這個順序是固定的,因此「我登入了,但甚麼都沒變」永遠不會是一種受支援的結果。

同一個人在 GitHub 上是 octocat,在 GitLab 上則完全是另一個身分。Control Center 按託管平台解析你的身分,並為每個程式庫使用正確的那一個;這正是「有待我審查」、「由我建立」和「你已批准」在混合的工作區中依然正確的原因。

如果某個託管平台的身分尚未解析,它的程式庫就不會為收件箱貢獻任何內容,而不是比對到所有東西。收件箱會如實說明,而不是聲稱你已經全部看完。

收件箱與 PR 佇列會分散查詢工作區中出現的每個託管平台,並把結果合併成單一資料流 —— 一個 GitHub pull request 和一個 Bitbucket pull request 會並排出現,按時間排序,而不是按供應商分組。

失敗是互相隔離的。某個託管平台若無法連線、受到速率限制或尚未連接,就不會貢獻任何內容,也不會影響其他平台;它永遠不會令整個收件箱變空。它自己的程式庫會繼續顯示最後已知的狀態,直到它恢復為止。

每個託管平台都支援核心流程:列出並開啟 pull request、閱讀 diff、在行內與頂層留言、審查、合併與關閉。除此之外,它們確實各有不同,而 Control Center 會把託管平台做不到的事隱藏起來,而不是顯示一個會靜默失敗的控制項。

能力 GitHub GitLab Bitbucket
批次(待提交)審查 ✓ ✓ —
要求變更 ✓ ✓ ✓
每個檔案的「已檢視」狀態同步 ✓ — —
Emoji 反應 ✓ ✓ —
團隊/群組審查者 ✓ ✓ —
建議審查者 ✓ — ✓
PR 上的 CI 結果 ✓ ✓ ✓
深入查看 CI 工作的步驟/日誌 ✓ ✓ —
堆疊式 pull request ✓ — —
PR 描述範本 ✓ ✓ —
通知輪詢 ✓ — —
豐富的使用者個人資料 ✓ ✓ —
伺服器端 PR head ref ✓ ✓ —

當某項能力缺失時,功能會如實降級:

  • 已檢視狀態仍然有效,但只限於你設定它的那部裝置。
  • Bitbucket 上的批次審查會逐條留言送出,所以審查者會看到它們逐條抵達,而不是一次全部出現。
  • Bitbucket 上沒有 PR head ref,意味着檢出一個 pull request 時會按名稱取得其來源分支,而該分支一旦被刪除就會失敗。

GitLab 把 pull request 稱為 merge request。Control Center 在自己的模型中一律說「pull request」,而在談到某個託管平台時,則使用該平台自己的名詞。

PR 清單是空的,並說某個託管平台尚未連接

標題為「PR 清單是空的,並說某個託管平台尚未連接」的章節

你沒有那個託管平台的憑證。請在 設定 → 工作區 → 個人資料與身分 → 程式碼託管 中登入或貼上權杖。其他託管平台的程式庫不受影響。

我連接了託管平台,但它的程式庫仍然甚麼都不顯示

標題為「我連接了託管平台,但它的程式庫仍然甚麼都不顯示」的章節

檢查該列的副標題。如果它顯示「via this server’s app」或「from the environment」,那麼正在回答的就是另一個憑證,而不是你預期的那個 —— 你自己要求的一切都以你的憑證為優先,所以若它顯示的是別的,就代表你的憑證沒有儲存成功。

註冊需要同時滿足三項:路徑位於 git 工作樹內、它有一個 origin 遠端,而且該遠端指向 github.com、gitlab.com 或 bitbucket.org。見將程式庫加入工作區。

那是速率限制的斷路器。當某個託管平台發出已達主要限制的訊號,用戶端就會在本機令後續請求失敗,不發出網絡呼叫,直到該時窗過去 —— 因此重試風暴無法加深限制。暫時性失敗會以指數退避重試。