2013-02-10 127 views
9

我想創建一個新的存儲庫作爲我的項目的子模塊。Git:創建回購作爲子模塊

通常情況下,我創建了一個GitHub庫,然後使用命令 git submodule add url_to_repo.git

其添加爲一個子模塊有沒有辦法直接創建一個新的回購作爲一個子模塊,而不首先創建回購其他地方(沒有本地也不偏僻,例如在Github上)?

回答

5

我不明白你是怎麼做到的:子模塊根據定義是來自另一個回購站的SHA1(即其他回購站必須存在父回購站以提取所述SHA1):您必須在.gitmodules file中引用其地址你繼續在父母回購。

子模塊從在指特定內存儲庫是完全分開的內commit對象的主要儲存庫中的所謂gitlink tree entry組成。

submodule.<name>.url 

定義從該子模塊儲存庫可被克隆的URL。這可能是一個準備好傳遞給git-clone(1)或(如果它以./../開頭)相對於超級項目的源存儲庫的位置的絕對URL。

所以你可以在本地創建子模塊回購,但你必須創建它。

+5

如何使用'git的init。 mkdir a; cd a; git init。;光盤..; git submodule add ./a a'還是一個壞主意? – manuels 2013-02-10 18:04:58

+0

@manuels這就是我剛剛在我的答案中添加的內容,但重點是:您必須創建一個回購協議,以便能夠在父回購中將其作爲子模塊進行引用。但是,我沒有看到一旦你的父母回購被推送到GitHub並被另一個用戶克隆時它將如何發揮作用。 – VonC 2013-02-10 18:06:16

+1

因此,如果我在超級回購目錄中創建回購*並將此目錄用作子模塊*,那麼這很好嗎? – manuels 2013-02-10 18:19:51

4

如果我理解你對,這是我經常爲eclipse項目和工作區所做的。讓我們先從這個結構:

$ find . 
. 
./projekt.txt 
./sub1 
./sub1/sub1.txt 
./sub2 
./sub2/sub2.txt 

首先初始化子模塊和主:

$ cd sub1 
$ git init 
$ git add * 
$ git commit -m "init sub1" 
$ cd ../sub2 
$ git init 
$ git add * 
$ git commit -m "init sub2" 
$ cd .. 
$ git init 
$ git status 
# On branch master 
# 
# Initial commit 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# projekt.txt 
# sub1/ 
# sub2/ 

要添加這些文件夾,子模塊代替普通的文件夾,只需執行下面的命令,並使用像./sub相對路徑而不是僅僅sub

$ git submodule add ./sub1 
$ git submodule add ./sub2 

現在看起來應該像

$ git status 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed: 
# (use "git rm --cached <file>..." to unstage) 
# 
# new file: .gitmodules 
# new file: sub1 
# new file: sub2 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# projekt.txt 

最後在父文件夾上做一個git add *git commit -m "init parent",就在那裏!

如果您現在更改其中一個子模塊中的文件,則必須首先提交子模塊,然後再提交父存儲庫,以便在有人克隆您的父回購時獲取最新版本的子模塊。

1

簡單!假設submodule_dir是您希望子模塊化的目錄的名稱(假設它尚未在git控制下)。

cd submodule_dir 
git init 
git add . 
git commit 
# on github, create the new repo, then: 
git remote add origin [email protected]:your_username/your_repo_name.git 
git push -u origin master 
cd .. 
mv submodule_dir submodule_dir_delete_me 
git submodule add [email protected]:your_username/your_repo_name.git submodule_dir 

之後(一旦你高興)

rm -rf submodule_dir_delete_me