簡體   English   中英

git repo子文件夾作為另一個repo的子樹?

[英]Git repo subfolder as subtree of another repo?

我的公司正在努力從SVN遷移到Git-部分原因是要利用以Git為源的部署軟件。 我們正在為應用程序堆棧的所有組件使用單個存儲庫(monorepo)。

我們也正在考慮將PM2用於NodeJS應用程序管理/部署。 由於它可以使用git存儲庫來部署更新,因此我們很樂意使用它-但實際上只需要部署存儲庫的一個子目錄。

是否可以創建一個git存儲庫,該存儲庫僅將另一個git repo的單個子目錄作為子模塊/子樹引用?

這樣-倉庫A是主要的monorepo,倉庫B是僅包含倉庫A中的NodeJS內容的倉庫。

RepoA\
  Component1\
  Component2\
  DelphiApp\
  NodeJSApp\
  PHPStuff\
  Configurations\
  Utilities\
RepoB\
  NodeJSApp\ <--subtree/submodule back to NodeJSApp in RepoA

對於git submodule ,簡短的回答是:

  • 您要么有一個存儲庫,要么沒有。

    • 如果您沒有存儲庫,則可以克隆它,現在可以了。 但你有倉庫 ,而不是倉庫一些子目錄。
  • 現在您已經有了存儲庫,或者在其中進行了提交,或者沒有。

    (提交由哈希ID識別(哈希ID是那些難看的字母和數字大字符串),並且由於人類不善於記住隨機的字母和數字字符串,並且出於其他目的,每個存儲庫都有一組名稱 ,每個名稱都記住一個哈希ID。名稱對有好處,但是Git 真正需要的是哈希ID。)

    • 如果您沒有提交,則可以將您的Git連接到另一個也具有存儲庫的Git。 您的Git可以詢問他們的Git有關您擁有的,您沒有的提交,並將這些提交放入您的Git存儲庫。 現在,如果他們有提交,您也可以。
  • 現在您有了存儲庫和提交,就擁有了所有文件。 提交是(或更准確地說,包含/引用並獲得) 每個文件的完整快照。

您不必使用所有文件。 您只能提取您關心的文件。 但這比僅使用git checkout name來獲取其哈希ID存儲在name name的提交要困難得多,這將獲取所有文件。 更簡單的方法可能就是方法。

其他選擇

請注意,Git具有處理子樹的各種過程。 他們中有些人被捕獲到稱為貢獻腳本git subtree ,對此有一個教程在這里 ,似乎OK(快速瀏覽)。 現在使用git subtree拆分庫,然后可以得到所需的內容。 我一般不建議使用子樹-最好將“類似庫的”代碼拆分為一個完全獨立的存儲庫。

然后,您可以使用多個非常簡單的獨立存儲庫,也可以使用git submodule從具有所有其余代碼的“ using-library”存儲庫中的“ library”存儲庫中選擇特定提交,或者在“僅獲取子模塊”超級項目中,該項目同時具有“使用庫”和“提供庫”存儲庫作為其(現在是兩個)子模塊。 也就是說,您有:

  • 超級項目:包含Component1/*Component2/*DelphiApp/*PHPStuff/*Configurations/*Utilities/* ,並引用子模塊NodeJSApp/ ,以及
  • 庫:包含文件* ,這些文件將NodeJSApp/在超級項目控制的NodeJSApp/目錄中

或者,您有:

  • superproject: 引用子模塊app/ ,並且引用子模塊app/NodeJSApp/

  • app:一個Git存儲庫,其中包含Component1/*Component2/*等,但根本不引用NodeJSApp/ 超級項目會將它們提取到app/以便其全名將為app/Component1/*app/Component2/*等。

  • 庫:一個Git存儲庫,其中包含構成庫的名為*文件。 超級項目會將它們提取到app/NodeJSApp/以便其全名將為app/NodeJSApp/*

除了被迫在第二種方法中在app/下查找所有內容之外,它們之間的唯一區別在於,使用第二種方法,您將獨立管理兩個獨立的Git存儲庫-一個用於應用程序本身,一個用於庫。 ,然后使用子項目會說: 從庫中的Git倉庫提取應用Git倉庫散列應用程序 ,哈希LIB生成項目。 也就是說, 兩個子項目都不需要知道Git-ness和哈希ID:只有超級項目才需要關心這一點。

使用第一種方法,您不需要app/頂層目錄,但是現在您主應用程序中進行的每次提交都記錄了哈希ID,Git應該在構建之前將Git提取到庫子模塊中。 如果更新庫,則需要在超級項目中記錄新的哈希ID。 這與以前相同,只是“超級項目” 應用程序本身 ,而不是僅包含兩個子模塊引用的第三個Git存儲庫。

比較常見的方法是兩個Git存儲庫,它具有文件充當超級項目以在子模塊中挑選特定的提交。 有時更方便。 有時,“一個監督其他所有項目的超級項目”方法更有意義 ,但這種情況絕對不常見。

是的你可以。 只是不要使用子模塊。 子樹或子倉庫可以為您提供幫助。 您可以將'NodeJSapp'設為repoA中的子樹或子倉庫。 它將有效地將目錄映射到相應的單目錄存儲庫。

這樣,您就可以將repo A用作主要操作,並在整個樹上(包括NodeJSApp目錄)進行原子操作(例如分支)。 您需要定期將其推入RepoB。 子模塊不能以這種方式工作。 子樹可以,但是在某些方面是有限的。 Subrepos可能是最佳的開源選擇。

也有一些自定義方法可以做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM