2013-02-10 97 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