Subtree 允許 Subprojects 包含在 Mainproject 的子目錄中,可以選擇包含 Subprojects 的整個 Commit 記錄或只保留一筆(squash)。
舉例來說,可以將某一個儲存庫的 Source code 包含在另一個儲存庫的子目錄中。
Subtree 不要與 Submodules 混淆,Submodules 用於同一任務。並且 Subtree 不需要在儲存庫中存在任何特殊的構造(例如 .gitmodules 文件或 gitlinks),也不會強迫使用儲存庫的用戶做其他事情或需要了解 Subtree 的工作方式。Subtree 只是一個子目錄,可以按照想要的任何方式與 Project 一起提交,分支和合併。
也不要與 Subtree merge 混淆。主要區別在於,除了將另一個 Project 合併為子目錄之外,您還可以從 Project 中提取子目錄的整個 Commit 記錄,並將其製作為獨立項目。與 Subtree merge 不同,Subtree 可以在這兩個操作之間來回切換。如果獨立儲存庫得到更新,則可以自動將更改 Merge 到 Project 中;如果在 Project 內部更新儲存庫,則可以再次 Split 更改,然後將其 Merge 回 Project 。
例如,如果為一個 Project 建立的 Subtree 之後在其他地方有被使用,則可以提取其整個歷史記錄並將其發佈為自己的 git 存儲庫,而不會意外地混入 Project 的歷史記錄。
<aside> 💡 為了使的 Commit 記錄保持乾淨,建議可能在 Subprojects 和 Mainproject 之間劃分 Commit 內容。也就是說,如果您進行的更改會影響 Subprojects 和 Mainproject ,就分兩部分提交。這樣當以後拆分庫(Split )時,Commit 記錄的描述仍然有意義。然而,如果這對你來說不重要,則沒有必要。 Git Subtree 在以後將其拆分到 Subprojects 中時,只會忽略提交中與 Subprojects 無關的部分。
</aside>
Options:
-q
, --quiet
:禁止在 stderr 上不必要的輸出消息。-d
, --debug
:在 stderr 上產生更多不必要的輸出消息。-P <prefix>
, --prefix=<prefix>
:在 Mainproject 中指定 Subtree 的相對路徑。此選項對於所有命令都是必需的。-m <message>
, --message=<message>
:此選項僅對 add、merge、pull 有效。指定 <message>
作為 merge commit 的commit message。Options for 「add, merge, push, pull」:
--squash
:
此選項僅對 add、merge、pull 命令有效。
只產生一個 Commit 記錄,然後將該新 Commit 合併到儲存庫中,而不是合併 Subprojects 中的整個 Commit 記錄,使用此選項有助於減少日誌混亂。
當同一個 Subprojects 多次包含在同一個 Mainproject 中,或者被刪除然後重新添加時,使用 --squash
還可以避免出現問題。在這種情況下,無論如何都無法合併歷史記錄,因為尚不清楚 Commit 記錄的哪一部分屬於哪個 Subtree 。
此外使用 --squash
可以在 Subprojects 的不同版本之間來回切換,而不必嚴格向前。無論是否使用 --squash
,在儲存庫中所做的更改都將保持不變,並且可以在以後拆分並發送給 Subprojects 。
Options for 「split」:
--annotate=<annotation>
:
在產稱 Commit 記錄時,將 <annotation>
作為前綴添加到每個 Commit 記錄中。
由於我們要使用相同的 Commit 記錄創建新的提交,但內容可能與原始 Commit 記錄不同,因此可以幫助區分它們並避免混淆。
無論何時拆分,都需要使用相同的 <annotation>
,否則將無法保證新創建的歷史記錄與舊的歷史記錄相同。這將阻止合併正常工作。