GitHub和GitLab等站點提供了直接在其 Web 界面中合并分支的方法。鑒于這些站點僅存盤裸存盤庫,它們如何執行這些合并?可以在裸克隆的命令列上做同樣的事情嗎?我發現這是使用管道命令的可能答案。
uj5u.com熱心網友回復:
因為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.
那么,從技術上講,也許?您鏈接的答案似乎很好地回答了這個問題。在實用的層面上,這將是有用的,不,似乎并非如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/367059.html
