【发布时间】:2013-02-10 17:47:18
【问题描述】:
我想创建一个新的存储库作为我项目的子模块。
通常,我创建一个 Github 存储库,然后使用命令将其添加为子模块
git submodule add url_to_repo.git
有没有办法直接创建一个新的 repo 作为子模块,而无需先在其他地方创建 repo(既不是本地也不是远程,例如在 Github 上)?
【问题讨论】:
标签: git git-submodules
我想创建一个新的存储库作为我项目的子模块。
通常,我创建一个 Github 存储库,然后使用命令将其添加为子模块
git submodule add url_to_repo.git
有没有办法直接创建一个新的 repo 作为子模块,而无需先在其他地方创建 repo(既不是本地也不是远程,例如在 Github 上)?
【问题讨论】:
标签: git git-submodules
简单!假设submodule_dir 是您希望子模块化的目录的名称(假设它尚未在 git 控制下)。
cd submodule_dir
git init
git add .
git commit
# on github, create the new repo, then:
git remote add origin git@github.com:your_username/your_repo_name.git
git push -u origin master
cd ..
mv submodule_dir submodule_dir_delete_me
git submodule add git@github.com:your_username/your_repo_name.git submodule_dir
稍后(一旦你开心)
rm -rf submodule_dir_delete_me
【讨论】:
git mv wrong_path correct_path 的命令修复,并且 git 也会自动修复子模块管道移动子模块。 (这个 mv 一个子模块需要 > git 版本 1.8.5)
如果我理解正确的话,这就是我经常为 Eclipse 项目和工作区做的事情。让我们从这个结构开始:
$ find .
.
./projekt.txt
./sub1
./sub1/sub1.txt
./sub2
./sub2/sub2.txt
首先初始化子模块和master:
$ 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" 就可以了!
如果您现在更改其中一个子模块中的文件,则必须先提交子模块,然后再提交父存储库,以便在有人克隆您的父存储库时获得子模块的最新版本。
【讨论】:
./sub1/sub2,那么git submodule add ./sub1/sub2 会将sub2 克隆到.,这不是您想要的。要解决这个问题,请使用git submodule add ./sub1/sub2 ./sub1/sub2。第一个路径指定从哪里添加,第二个路径指定添加到哪里。
cannot add to the index - missing --add option? 当我尝试提交 .gitmodules 和子模块文件时...
我不明白你怎么能:一个子模块定义为来自另一个 repo 的 SHA1(即父 repo 必须存在另一个 repo 才能提取所说的 SHA1):你必须在.gitmodules file 中引用它的地址你保留在父仓库中。
子模块由主存储库中所谓的gitlink tree entry 组成,它引用内部存储库中完全独立的特定提交对象。
submodule.<name>.url
定义可以从中克隆子模块存储库的 URL。这可能是一个准备好传递给 git-clone(1) 的绝对 URL,或者(如果它以
./或../开头)相对于超级项目的原始存储库的位置。
因此您可以在本地创建子模块 repo,但无论如何您都必须创建它。
【讨论】:
git init .; mkdir a; cd a; git init .; cd..; git submodule add ./a a 怎么样?还是个坏主意?
./myNestedRepo url 将引用他们的空目录本地工作站