over 4 years ago

簡單的紀錄 git-subtree 的使用方式。

使用方式

建立

建立 subtree 的情況主要分成下面 2 種:

  1. 從既有 module 從 project 中分離:

    1. 將目標資料夾分離,建立一個新的 branch。
      $ git subtree split --prefix=src/mod1 -b new_module
      
    2. 以 subtree 的方式,將新的 branch 合併進現有 branch。
      $ git subtree split --rejoin --branch=new_module --prefix=src/mod1
      
      這時候一個 subtree 形狀已經生成了。
    3. 將剛建立的 subtree 推送至另一個 Repo。
      $ git remote add common_repo git@github.com:lemonlatte/common_repo.git
      $ git push common_repo new_module 
      
  2. 匯入外部 module:
    首先,建立一個空的 mod1 資料夾,接著匯入外部的 repo 形成一個 subtree。

    $ git subtree add --prefix=src/mod1 --squash common_repo new_module 
    

Pull

每當 new_module 有了更新,如果要將新的部份加入我們的 source,只需要透過:

$ git subtree pull --prefix=src/mod1 common_repo new_module 

其中 new_module 可為 branch name 或是 commit number。

Push

當你 source 有任何變動且已經 Commit。如果變動的地方包含你的 subtree,你可以透過下面指令,將屬於 subtree 的差異,推送到 subtree 的 repo。

git subtree push --prefix=src/mod1 common_repo new_module

分析

紀錄一下,目前看到的優缺點。

優點

  1. 漂亮的將 commit 的差異拆開
    輕鬆、簡單的在一個 project 下,將 commit 中分屬不同 repo 的 code 拆解並推送到各自的 repo 。

  2. 不打斷既有工作流程。
    由於程式碼依舊存在於同一 project folder 下,對於非專門維護 subtree 的 programmer,只需按照原有的 git flow 繼續 commit 即可。

  3. 不會因為 subtree 的 repo 消失,而影響到既有 source code 的進行。

缺點

  1. 每個 subtree 都需要一個 Root 資料夾。檔案無法在散佈 Root 以外的地方。不過這也很合理,因為 subtree 基本上也是一個 git repo。

  2. 依舊需要 Push 多次。目前還沒有指令可以一次完成。

參考資料

多不勝數。如有需要請自行 Google。

← Parse decorated function by Sphinx Python Logging Adapter 的使用 →
 
comments powered by Disqus