因為GitHub是閉源的,我們不能確定他們的後端究竟是如何處理合併操作的。但是,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] 删除。
我来说两句