Git:创建repo作为子模块

时间:2013-02-10 17:47:18

标签: git git-submodules

我想创建一个新的存储库作为我项目的子模块。

通常,我创建一个Github repo,然后使用该命令将其添加为子模块 git submodule add url_to_repo.git

有没有办法直接创建一个新的repo作为子模块而不先在其他地方创建repo(既不是本地也不是远程,例如在Github上)?

2 个答案:

答案 0 :(得分:5)

我不知道你怎么可能:子模块根据定义是来自另一个repo的SHA1(即父repo必须存在另一个repo以提取所述SHA1):你必须在{{3中引用它的地址保留在父仓库中。

  

子模块由主存储库中的所谓.gitmodules file组成,它引用内部存储库中完全独立的特定提交对象。

submodule.<name>.url
  

定义可从中克隆子模块存储库的URL。这可以是准备传递给git-clone(1)的绝对URL,或者(如果它以./../开头)相对于超级项目的原始存储库的位置。

所以你可以在本地创建子模块repo,但无论如何你必须创建它。

答案 1 :(得分: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",就在那里!

如果您现在更改其中一个子模块中的文件,则必须先提交子模块,然后再提交父存储库,以便在有人克隆您的父存储库时获取子模块的最新版本。