我想把一个子模块放到回购中。问题是,当我克隆父repo时,子模块文件夹完全是空的。
有没有办法让git clone parent_repo实际将数据放入子模块文件夹?
例如,http://github.com/cwolves/sequelize/tree/master/lib/,nodejs-mysql-native指向外部git子模块,但当我签出sequelize项目时,该文件夹为空。
对于git 2.13及更高版本,可以使用--recurse-submodules代替--recursive:
1 2
| git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar |
编者按:-j8是一种可选的性能优化,在2.8版中可用,一次最多可以并行提取8个子模块—见man git-clone。
对于1.9版的Git,直到2.12版(-j标志仅在2.8+版中可用):
1 2
| git clone --recursive -j8 git://github.com/foo/bar.git
cd bar |
对于Git和更高版本的1.6.5,您可以使用:
1 2
| git clone --recursive git://github.com/foo/bar.git
cd bar |
对于已克隆的Repo或较旧的Git版本,请使用:
1 2 3
| git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive |
- 在Git存储库中,是否有任何方法可以将此行为指定为默认行为,以便不太知情的克隆人自动获得已初始化的子模块?
- @不幸的是,没有(至少我不知道)。
- 逻辑上思考Git克隆——递归也将填充子模块的任何子模块,对吗?
- @似乎不是:stackoverflow.com/questions/425400/…
- +1代表"老"Git Way,它允许您在已克隆的Repo上执行此操作。
- 您可能需要考虑git子树blogs.atlassian.com/2013/05/…它在@nhdaly comment中解决了这个问题。
- @当然,把这个加到你的~/.gitconfig中,在[alias]部分:cloner = clone --recursive下。
- @SLF虽然有帮助,但它没有回答@nhdaly的问题。.gitconfig设置是全局的,不只是针对单个存储库。
- @马修·比尼恩啊,你说得对,先生。我误解了这个问题。
- 在完成这些操作后,最好将源切换到主分支(或任何分支),因为您的repo将是无头的。来自顶级回购——git submodule foreach git checkout master。
- @托斯特:这是明智之举吗?如果持有回购需要的子模块版本不是master,该怎么办?
- @高蒂尔-谢谢你…如前所述,如果是除master以外的任何分支机构,请用除master以外的首选分支机构名称替换master。
- @即使如此,正确的提交也不一定在分支的顶端。
- 您可以使用git submodule update --depth 10 --recursive --init浅化回购
- 这不适用于Git2.7,但适用于Git2.9
- 谢谢!在运行sh -c 'cd cmd/ios7crypt && go install'之前,我忘记了用git submodule update --init --recursive检索子模块的依赖内容。
- 我做了git submodule update --init --recursive,但是所有的子模块都处于DECASTED状态,我必须进入每个子模块和结帐主。有人知道为什么吗?
- 我有git 1.9.1,git clone --recursive -j8 [email protected]:repoToClone不起作用。它告诉我,如果我把-j8取下来,它会很顺利地工作。
- 看起来,旗名已更新为--recurse-submodules。
- 我想我每个月都会回到这个答案…为什么Git不问问克隆是否也应该下载子模块呢?
- 这对我很有用,谢谢你!
- 我想-j8选项对已经克隆的repos不可用?
- 如果repos不是公共的,并且需要一个令牌/身份验证,这个命令将要求您一次又一次地输入每个子模块的访问令牌/或用户密码。有什么解决办法吗?
- 我在发行说明和源代码中都找不到任何贬低说明。--recurse子模块是记录在案的首选方法,但是--recursive并没有被弃用。
- @高潮你是对的。有人修改了我的答案,加上了那句话,不知怎么地,它被接受了。我已经修好了。谢谢!
- 此外,为了明确(因为我想知道,除了查看源代码之外找不到答案),Git克隆--recursive和--recurse-submodules选项的行为相同。它们会导致调用同一个函数。
在填充子模块之前,您必须做两件事:
1 2
| git submodule init
git submodule update |
- 我很害怕…这没有任何意义,因为在这种情况下您要签出一个部分项目。我知道子模块的更新不是自动的,但是为什么绑定版本不能自动签出呢?有什么办法强迫它吗?我有一个包含三个层次子模块的项目,仅仅为了结账就必须穿过那么远,这看起来很荒谬。
- 请阅读git-submodule(1)手册页(kernel.org/pub/software/scm/git/docs/git submodule.html)。您会发现git submodule update支持一个名为--recursive的好参数。
- 为什么不在一个命令中同时执行这两个命令呢?git submodule update --init(也见我的回答)。
- 我认为用这两个命令来回答这个问题更好。它更好地解释了如何完成任务。
- @我刚登录的一台机器只有git 1.5.5.6,这显然不支持缩短的指令,但支持它作为两个命令。
- @我想你误解了。git submodule update --init必须在1.5.5.6中扩展到git submodule init; git submodule update。
- 在我这样做之后,如果我cd到子模块目录和git pull中,它说它的头是分离的,我不能在其中进行git pull更新,有什么方法可以解决这个问题吗?
2010年原始答案
正如Joschi在评论中提到的,git submodule现在支持--recursive选项(git1.6.5及更多)。
If --recursive is specified, this command will recurse into the registered submodules, and update any nested submodules within.
有关init部分,请参见递归地使用git子模块。更多信息请参见git submodule解释。
With version 1.6.5 of git and later, you can do this automatically by cloning the super-project with the –-recursive option:
1
| git clone --recursive git://github.com/mysociety/whatdotheyknow.git |
使用git 2.8更新2016:请参见"如何使用git clone --recursive加速/并行下载git子模块?"
您可以使用多个线程并行启动获取子模块。例如:
1
| git fetch --recurse-submodules -j2 |
您可以使用此命令克隆所有子模块的repo:
1
| git clone --recursive YOUR-GIT-REPO-URL |
或者,如果您已经克隆了项目,则可以使用:
1 2
| git submodule init
git submodule update |
如果在分支中添加了子模块,请确保将其包含在克隆命令中…
1
| git clone -b <branch_name> --recursive <remote> <directory> |
试试这个:
1
| git clone --recurse-submodules |
它会自动拉入子模块数据,假设您已经将子模块添加到父项目中。
- 注意,--recurse-submodules和--recursive是等价的别名。
- 如果您已经在父克隆的repo中呢?
- @在这种情况下,您可以按照本答案中的说明执行git submodule update --init --recursive。
迟到的回答
1 2
| // git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https:// [email protected]/USERNAME/REPO.git DESTINATION_DIR |
就像我花了一个小时和一个朋友闲逛一样:即使你对BitBucket有管理权限,也要克隆原始存储库并使用拥有repo的人的密码。当你发现自己遇到了这个雷区时很恼火:p
- 这正是我要处理的问题。那么,您是说需要在具有子模块的BitBucket存储库上开发的任何人都必须使用存储库创建者的凭证吗?布莱奇
- @Jsleuth看起来是这样的-太糟糕了…我也知道。
- 听起来像个虫子。你向Bitbacke报告过吗?
- @马蒂亚斯比涅斯,你在这个问题上偶然发现了吗?一年半之后,我真的不知道情况是否仍然如此。
- @凯撒不,我只是偶然发现了你的回答,很惊讶。
- 只有当您使用https并且用户在URL中时,才会出现这种情况?正确的方法是将ssh auth与私钥/公钥对一起使用,这样就不会请求密码。
- @凯撒这个答案真的应该删除
- @特列芬农为什么?
- 它没有描述性地回答ops问题,但详细描述了bitback中一个不相关的bug;顺便说一下,它可以被缩短为"使用ssh密钥认证"。
- @Treffynnon记录在这里,因为不清楚这是亚特兰蒂斯断层。参见upvotes:似乎其他的PPL也遇到了这个问题,搜索这个问题,并很高兴在搜索引擎中索引良好。
尝试在Git存储库中包含子模块。
1
| git clone -b <branch_name> --recursive <remote> <directory> |
或
1
| git clone --recurse-submodules |
克隆存储库时,可以使用--recursive标志。此参数强制Git克隆存储库中所有定义的子模块。
克隆后,有时子模块分支可能会更改,因此在克隆后运行此命令:
1
| git submodule foreach"git checkout master" |
我想你可以走三步,
1 2 3
| git clone
git submodule init
git submodule update |
子模块并行获取旨在通过一次获取多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的--jobs选项来实现,例如:
1
| git fetch --recurse-submodules --jobs=4 |
根据Git团队的说法,这可以大大加快包含许多子模块的存储库的更新速度。使用--recurse子模块而不使用新的--jobs选项时,git将逐个获取子模块。
资料来源:http://www.infoq.com/news/2016/03/git28-released
试试这个。
1
| git clone -b <branch_name> --recursive <remote> <directory> |
如果在分支中添加了子模块,请确保将其添加到clone命令中。