2017-04-08 73 views
0

我試圖建立一個分支,使得branchA具有子文件夾AB,但B包含branchB的內容。包含其他分支作爲子目錄?

我一直在尋找submodulessubtreessubrepos,但我想不出什麼會做什麼,我期待的。

爲了防止這成爲一個XY問題,我的總體情況是這樣的:我正在開發一個HTML5/JS遊戲,我希望能夠在Github頁面上測試它。
所以我想要分支/子目錄gh-pages/play包含分支master

回答

1

分支沒有文件夾/目錄。分支,很簡單,指向提交哈希ID的指針(它們從包含原始哈希ID的小文件開始,儘管它們可以壓縮成一種名稱到ID映射的數據庫,Git可以節省時間以及不經常變化的名稱空間)。所以這是不可能的。

可能做你想要的子模塊,但。這只是棘手。你必須非常小心。我也完全不清楚它是否可以用於任何GitHub Pages的事情,因爲他們不得不做一個克隆和檢查與子模塊操作。

一次Git 子模塊真的只是一個Git倉庫:你告訴Git的一些目錄(「文件夾」),如B應該通過克隆不同 Git倉庫,從某些特定網址進行。一旦克隆完成後,Git應該將cd放入git clone生成的目錄中,然後git checkout通過哈希ID進行一次特定的提交。

那麼,如果要爲「不同的」Git存儲庫想要git://host.name/path/to/url.git檢入子目錄B,請指定URL git://host.name/path/to/url.git

這裏的明顯的危險是無限遞歸的潛力:Git的檢出url.git,發現它有一個子模塊,克隆url.git到子目錄B,檢查出裏面B提交,發現它有一個子模塊,克隆它, cd s到現在的B/B,發現它有一個子模塊,克隆它,進入B/B/B,發現它有一個子模塊...

你避免這種無限遞歸:

  • 沒有克隆回覆草書子模塊提取(這是git clone的默認設置),和/或
  • 確保從不對子模塊進行特定的提交包含將子模塊作爲子模塊的提交。

但還有一個更的問題:子模塊檢查出一個具體的承諾通過哈希ID,而不是由分支名。你想B是一個自我克隆,簽出分支master(這可能從來沒有自我submodule B)。但所有你可以得到是一個B簽出一個特定的Git哈希ID,這是你存儲在超級項目(這當然是同一個存儲庫)提交中的哈希ID。

有一些方法可以將子模塊從其特定的提交中解脫出來,包括通過分支名稱檢出分支的方法。這些需要運行特定的git submodule命令,這是可能阻止您在GitHub頁面上執行此操作的一部分(不管是什麼)。但是,假設他們讓你完成子模塊的工作,則不一定非得通過名稱:你可以做一個新的提交,將新的master散列存儲到超級項目中。

舉個例子,假設你在這個超子項目中使用分支develop作爲子模塊。在develop中,有一個.gitmodules文件,上面寫着「我有一個應該克隆到B中的子模塊/子項目,使用此URL」(這是超級項目的URL)。在尖提交發展的那麼這次提交包含「gitlink」樹條目,上面寫着「讓克隆到B,在.gitmodules仰視子項目的網址,並使用哈希deadb0a」 - 這是尖端的哈希分支master的承諾

一旦你前進的master尖端到提交ac0ffee,你看看develop並作出提交具有「gitlink」樹條目,上面寫着「讓克隆到使用散列ac0ffeeB」 。沒有別的變化,只是哈希ID,但是現在,當有人取出develop啓用子模塊,他們得到B同犯,他們將通過檢查分支masterB,因爲分支master說:「退房哈希ac0ffee「。

(顯然,這整個事情是有點容易出錯,因爲在一般的子模塊。我懷疑這是不是一個非常明智的路徑往下走,但在理論上,至少,它可以工作。)

+0

有趣的事實:子模塊現在可以跟蹤分支。 –

+0

@DuncanXSimpson:因此*有一些方法可以將子模塊從其特定的提交中移除,其中包括通過分支名稱檢查分支的方法。這些需要運行特定的git子模塊命令... *您必須設置分支的名稱(我認爲您可以保存在提交的'.gitmodules'文件中),然後運行'git submodule update --remote'或'git子模塊結帳--remote'。 – torek

相關問題