2017-07-13 94 views
1

問題設置,跳到問題的換行。隱藏git子模塊子目錄,直到子模塊初始化調用

我在projectA上工作,它有它自己的git repo。這個projectA在projectB中有一些可選的工具,它是它自己獨立的git倉庫。根據我的理解,這聽起來像是一個git子模塊的情況,使projectB成爲projectA的子模塊。

要設置這個,我使用git submodule add projectB。這將在projectA中創建一個子目錄,它的作用類似於projectB的鏈接,該信息保存在.gitmodule中。你需要提交這個文件和「子目錄」。我可以繼續在projectA上進行開發,而不必關注projectB。當我更新projectB並推送它們時,我可以使用git submodule update --remote更新projectA中的projectB。這通過將文件內部更新爲projectB的當前版本(未由projectA跟蹤)和子目錄文件本身(由projectA跟蹤)來更改projectA中的projectB子目錄。

現在假設第三個用戶想要使用projectA並創建projectC,但不需要projectB。他們使用git clone projectA,他們得到projectA和.gitmodule的所有項目以及projectB的空子目錄。我希望他們仍然可以得到.gitmodule,以便他們將來有選擇,但有可能使他們不會獲得projectB的空子目錄?


我的問題是有可能隱藏一個子模塊項目B在了projectA用戶執行git submodule init>git submodule update前的子目錄?

恐怕這是不可能的,因爲該子目錄實際上是一個特殊的git文件,告訴哪個提交得到projectB,我原以爲被保存在.gitmodule。我感興趣的是,如果有更好的方法來實現我想要完成的任何git hack。

+0

一種解決方案是讓隱藏目錄調用'。子模塊全部駐留的模塊('mkdir .modules; cd .modules; git submodule add projectB')。然後,我會指示用戶在他們的工作目錄中創建一個符號鏈接ln -s .modules/projectB,並將名爲'projectB'的文件的符號鏈接添加到'.gitignore'中。那些必須執行'git submodule init'的額外步驟; git子模塊更新;無論如何,ln -s .modules/projectB'不應該是一個大問題,並且爲那些不需要子模塊的人保持項目清潔。 –

回答

1

我的問題是有可能隱藏一個子模塊projectBprojectA用戶執行git submodule init>git submodule update前的子目錄?

是:爲第三個用戶創建一個分支。
除了你需要從提交之前的開始該分支之前,你添加了子模塊(這樣,根本沒有子目錄)。

然後,你需要你的當前分支合併到分支,without committing:這樣一來,就可以刪除.gitmodules和子文件夾(如果它們只保留.gitmodules,Git的會抱怨沒有子模塊在指定的路徑)。
承諾完成合並。

現在,任何從該分支合併回你不會刪除.gitmodules和子文件夾,因爲新的分支取得刪除自成立以來,那些(起動因此重要性說,從一個分支之前提交創建子模塊。

如果以後新的用戶希望得到的子模塊,他/她可以checkout that file from your branch

git checkout yourBranch -- .gitmodules 
git checkout yourBranch -- a/submodule 
+0

啊聰明的方法思考大圖。如果我正確地遵循了這個想法,這看起來像是在不需要子模塊的直接用戶時要做的補丁。否則,維護這個單獨的sans子模塊分支似乎有點費力。例如,如果該用戶想要稍後從主分支中拉出,他們最終將拉動子模塊信息正確?所以新分支只能推動而不能拉動。 –

+0

@NoviceC「例如,如果用戶想要稍後從主分支拉出,他們最終將拉動子模塊信息是否正確?」是的,再次提醒一下,'git merge --no-commit'允許第三個用戶在提交之前刪除子模塊和'.gitmodules'。 – VonC

+0

我看到,如果我實際上將sans子模塊作爲主要主和開發分支,這可以很好地工作。當我需要更新子模塊時,我可以簽出子模塊分支,執行'git checkout submoduleBranch; git submodule update --remote; git commit; git push'。否則,我可以將來自主/開發分支的結果合併到沒有子模塊的實際開發中。那麼每次都不用大驚小怪地刪除這些文件。 –