git-merge 在公共裸倉庫中

吉姆

GitHubGitLab等站點提供了直接在其 Web 界面中合併分支的方法。鑑於這些站點僅存儲裸存儲庫,它們如何執行這些合併?可以在裸克隆的命令行上做同樣的事情嗎?我發現是使用管道命令的可能答案。

賽泰克

因為GitHub是閉源的,我們不能確定他們的後端究竟是如何處理合併操作的。但是,GitLab 開源的,我們可以查看實現細節,這些細節隨著時間的推移而發生了變化。

GitLab 是如何做到的

今天,UI 中出現的大多數與 git 相關的功能,包括 GitLab 上的 git 合併,都由 GitLab 的gitaly組件處理,該組件與 git 存儲庫的物理存儲交互。它主要使用其依賴庫git2go來執行實際的 git 操作。

仔細查看 的源代碼gitaly,我能做出的最好評估是 gitaly 實際上確實廣泛使用了 git 操作的工作樹,包括合併。存儲庫和工作樹通常被打開並克隆到“隔離”目錄,這些目錄只是即時創建的臨時目錄,存儲庫的工作樹被克隆到臨時目錄中(請參閱quarantine.go#L40-58,從merge.go#L53調用)。

他們如何執行這些合併?

因此,要回答你的問題:至少有GitLab,工作樹木用於合併(其它操作),並沒有在裸存儲庫進行。您只是看不到它們,因為在將它們提交到實際存儲庫路徑之前使用了臨時目錄。

我們或許可以假設 GitHub 做了類似的事情,但無法確定。

可以做到嗎?

可以在裸克隆的命令行上做同樣的事情嗎?

您指出了一個似乎無需檢查工作樹即可工作的示例但它的工作原理是寫出樹(使用git write-tree),這在實際層面上似乎沒有任何優勢,比如從裸倉庫克隆並檢查工作樹並git正常使用操作。對於性能(預期可能的反對意見),您可以使用 tempfs 或其他一些內存映射位置。

我也不確定鏈接的答案是否足以執行git merge.

那麼,從技術上講,也許?您鏈接的答案似乎很好地回答了這個問題。在實用的層面上,這將是有用的,不,似乎並非如此。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章