如何“git克隆”一个仓库,包括它的子模块?

如何克隆git存储库,以便它也克隆其子模块?

运行git clone $REPO_URL只是创建空的子模块目录。

1320234 次浏览

在填充子模块之前,您必须做两件事:

git submodule initgit submodule update

Git 2.23(2019年第三季度):如果您想克隆,请将子模块更新到最新版本:

git clone --recurse-submodules --remote-submodules

如果您只是想在记录的SHA1中克隆它们:

git clone --recurse-submodules

见下文。

请注意,Git 2.29(2020年第四季度)对子模块处理进行了重大优化。

提交a462bee(2020年9月6日)byOrgad Chaneh(#0)
(由提交2ce9d4e中的Junio C Hamano----#0----合并,2020年9月18日)

#0:禁止检查文件名和对象id的ref歧义

署名:Orgad SHANEH

collect_changed_submodules()的artv参数只包含对象id(所有引用的对象引用)。

通过传递assume_dashdash,通知setup_revisions()输入不是文件名,因此它可以避免每个引用的冗余统计信息。

还要抑制refname_ambiguity标志以避免对每个对象进行文件系统查找。类似的逻辑可以在cat文件、包对象等中找到。

这种变化减少了时间#0man)在我的存储库从25s到6s


2010年原答复

正如joschi在评论中提到的,#0现在支持--recursive选项(Git1.6.5及更多)。

如果指定了--recursive,则此命令将递归到已注册的子模块中,并更新其中的任何嵌套子模块。

初始化部分见递归地使用git子模块
#0解释更多

在git 1.6.5及更高版本中,您可以通过使用–-recursive选项克隆超级项目来自动执行此操作:

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

2016年更新,git 2.8:参见“如何使用#0加速/并行化git子模块的下载?

您可以使用多个线程并行启动获取子模块。
例如:

git fetch --recurse-submodules -j2

更好的是,使用Git 2.23(2019年第三季度),您可以在一个命令中将子模块克隆并签出到他们的跟踪分支!

提交4c69101(2019年5月19日)byBen Avison(#0)
(由提交9476094中的Junio C Hamano----#0----合并,2019年6月17日)

clone:添加--remote-submodules标志

当使用git clone --recurse-submodules时,以前没有办法将--remote开关传递给隐式git submodule update命令您希望子模块在其上签出的任何用例远程跟踪分支,而不是超级项目中记录的SHA-1。

此补丁纠正了这种情况。
它实际上也传递--no-fetchgit submodule update,因为它们的子模块刚刚被克隆,所以再次从远程获取只会减慢速度。

这意味着:

--[no-]remote-submodules:

所有被克隆的子模块将使用子模块的远程跟踪分支的状态来更新子模块,而不是超级项目记录的SHA-1。等效于传递--remotegit submodule update

在Git 2.13及更高版本中,可以使用--recurse-submodules代替--recursive

git clone --recurse-submodules -j8 git://github.com/foo/bar.gitcd bar

编者注:-j8是一个可选的性能优化,在2.8版中可用,并且一次并行获取多达8个子模块-请参阅man git-clone

从Git的1.9版到2.12版(-j标志仅在2.8+版中可用):

git clone --recursive -j8 git://github.com/foo/bar.gitcd bar

使用Git 1.6.5及更高版本,您可以使用:

git clone --recursive git://github.com/foo/bar.gitcd bar

对于已经克隆的repos或较旧的Git版本,请使用:

git clone git://github.com/foo/bar.gitcd bargit submodule update --init --recursive

如果您的子模块被添加到分支中,请务必将其包含在您的克隆命令中…

git clone -b <branch_name> --recursive <remote> <directory>

试试这个:

git clone --recurse-submodules

假设您已经将子模块添加到父项目中,它会自动提取子模块数据。

迟来的回答

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORYgit clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

就像我刚刚花了整整一个小时和一个朋友闲逛一样:即使你在BitBucket上拥有管理员权限,也要始终克隆原始存储库并使用拥有存储库的人的密码。

子模块并行获取旨在通过启用一次获取多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的--作业选项来完成,例如:

git fetch --recurse-submodules --jobs=4

根据Git团队的说法,这可以大大加快更新包含许多子模块的存储库的速度。当使用没有new--作业选项的--的子模块时,Git会一个接一个地获取子模块。

来源:http://www.infoq.com/news/2016/03/git28-released

[快速回答]

您可以使用此命令使用所有子模块克隆您的repo:

git clone --recursive YOUR-GIT-REPO-URL

或者,如果您已经克隆了项目,则可以使用:

git submodule initgit submodule update

尝试在git存储库中包含子模块。

git clone -b <branch_name> --recursive <remote> <directory>

git clone --recurse-submodules

试试这个。

git clone -b <branch_name> --recursive <remote> <directory>

如果您在分支中添加了子模块,请确保将其添加到clone命令中。

我认为你可以用三个步骤:

git clonegit submodule initgit submodule update

您可以在克隆存储库时使用--recursive标志。此参数强制git克隆存储库中所有定义的子模块。

git clone --recursive git@repo.org:your_repo.git

克隆后,有时子模块分支可能会更改,因此在它之后运行此命令:

git submodule foreach "git checkout master"

[快速回答]

克隆父仓库(包括一些子模块仓库)后,执行以下操作:

git submodule update --init --recursive

如果这是一个新项目,你可以这样做:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName

如果已经安装,则:

$ cd YourProjectName (for the cases you are not at right directory)$ git submodule init$ git submodule update

我在GitHub存储库中遇到了同样的问题。我的帐户缺少SSH密钥。该过程是

  1. 生成SSH密钥
  2. 为您的GitHub帐户添加新的SSH密钥

然后,您可以使用子模块克隆存储库(git clone --recursive YOUR-GIT-REPO-URL

运行git submodule initgit submodule update以获取已经克隆的存储库中的子模块。

只需在您的项目目录中执行这些操作。

$ git submodule init$ git submodule update

使用此命令将repo与所有子模块克隆

git clone --recurse-submodules git@gitlab.staging-host.com:yourproject

更新所有子模块的代码

git submodule update --recursive --remote
git submodule foreach git pull origin master

初始化1.git子模块2.git子模块更新

或者git stash-u开发工具git拉取原始主机git stash p

我如何"git克隆"一个仓库,包括它的子模块?

(我把它作为一个独立的答案,因为我认为这在git中很重要)

可悲的是,但有很多情况下,less-informed cloners无论如何都会错过外部:

因此,使用git没有一种内置的方法可以绝对完全地获取外部依赖项。这意味着没有一种方法可以绝对完全备份任何随机git存储库。

如果子模块是私有子模块,您可以使用凭证存储,以便它也递归地克隆其私有子模块。

USER=${GITHUB_ACTOR}TOKEN=$\{\{ secrets.JEKYLL_GITHUB_TOKEN }}
git config --global credential.helper storeecho "https://${USER}:${TOKEN}@github.com" > ~/.git-credentials
git clone --recurse-submodules -j8 git://github.com/foo/bar.gitcd bar

我用它来克隆我的子模块,其中私有模块在第五层深中。请允许我向您展示它是如何运作的:

输入图片描述