2017-02-04 112 views
3

我有一個名爲「foo」(或者說「myusername/foo」)的github存儲庫。現在假設我想創建一個名爲「bar」的存儲庫,它使用foo中的代碼;我可以製作一份文件的副本,但我不想要更新 - 我只想現在只查看「foo」存儲庫中的所有內容;並且不提供「從foo更新」的提交。我相信我已經注意到一些存儲庫,其中子文件夾實際上是獨立的存儲庫;而且我知道git支持子庫或其他類似的東西。那麼,我可以執行這樣的「存儲庫裝載」嗎?如果是這樣,怎麼樣?如果如何將一個github存儲庫「mount」爲另一個存儲庫的子文件夾?

加分點我可以有「摩的」在某個版本,還是有一定的分支,而不是主

+1

使用子模塊進行調查。他們並不完美,但他們可能會解決你的問題。 –

+0

@TimBiegeleisen:鏈接?而且 - 你的意思是說這是GitHub功能還是git功能? – einpoklum

+0

這是一個:http://blog.joncairns.com/2011/10/how-to-use-git-submodules/ –

回答

3

你要管理的git子項目2的主要選擇。
Git不會有任何依賴性經理和最常用的選項如下:

  • 子模塊

Submodules
允許將外部存儲庫嵌入源樹的專用子目錄中,始終指向特定的提交。


git submodule

爲了使用子模塊的每個文件夾將是一個獨立的存儲庫,並進行管理,並存儲在不同的位置。 Git將簽出特定的提交(提交,版本,標籤等)並將其用作子模塊的HEAD。大多數情況下子模塊將處於分離的HEAD中。

# once you have a repo simply add it to git 
git submodule add <url> 

一旦投影被添加到你的回購,你必須初始化和更新它。

git submodule init 
git submodule update 

作爲GIT中的1.8.2新選項--remote加入

git submodule update --remote --merge 

fetch從上游每個子模塊中的最新變化,merge them in,和check out子模塊的最新版本。

由於the docs形容它:

--remote

此選項僅適用於update命令。使用子模塊的遠程跟蹤分支的狀態,而不是使用超級項目的已記錄的SHA-1來更新子模塊。

這相當於在每個子模塊中運行git pull。


如何解決或子模塊內部的變化代碼?

使用子模塊將會把你的主要項目中的代碼作爲其內容[新文件夾]的一部分。

將它置於文件夾內部或將其作爲子模塊的一部分之間的區別在於,在子模塊中,內容被管理(提交)到不同的獨立存儲庫,如上所述。


這是一個子模塊 - 項目在另一個項目中,其中每個項目是一個獨立的項目的說明。

enter image description here


git subtree

的Git樹允許你插入任何存儲庫中的另一個

一個子目錄非常相似,submodule,但主要區別在於代碼的管理位置。在子模塊中,內容被放置在單獨的回購站中,並在那裏進行管理,以便您將其克隆到其他許多回購站。

subtree被管理內容作爲根項目的一部分,而不是在一個單獨的項目。

而不是寫下如何設置和理解如何使用它,你可以簡單地閱讀這個優秀的文章,這將解釋這一切。

https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/

+0

關於git子模塊:我不明白...(1)什麼時候是「一旦你有回購「?什麼時候和什麼時候我發出子模塊add命令? (2)在列出的命令中,我應該指定將子模塊檢入哪個子文件夾中(3)HEAD如何成爲除分支上最新提交之外的任何內容?你說如果我選擇corelib repo的某個提交,它將成爲我的HEAD;這似乎與您所鏈接的定義相矛盾。 – einpoklum

+1

(1):一旦你有一個回購 - 爲你想要的代碼創建一個新的回購,而不是原始回購的一部分。 (2)子模塊的名稱將是該文件夾,或者您可以傳遞其他參數來指定名稱。 (3)git可以指向任何不僅是最新的提交者。試試這個:'git checkout HEAD〜10' – CodeWizard

2

旁邊的子模塊和子樹,根據您的具體需求,您可能還需要只是有沒有任何邏輯和管理的另一個倉庫。

在這種情況下,您可以將另一個存儲庫放在子目錄中,並將該子目錄添加到.gitignore文件中。

E.g.

RepositoryA/ 
    - .gitignore (first option) 
    - SomeDir/ 
    - .gitignore (second option) 
    - RepositoryB/ 

的.gitignore(第一個選項)

添加這些中的一個:

  • SomeDir/RepositoryB/
  • **/RepositoryB/

的.gitignore(第二選項)

補充一點:

  • RepositoryB/

這樣一來,正如我所說的,不添加任何邏輯/管理。它只是讓你可以使用任何版本庫中的任何版本而不會發生任何衝突。

相關問題