Git:如何将子模块推送到远程存储库?

Car*_*rlo 16 git git-submodules

我使用git来跟踪我正在处理的网站.我在我的机器上工作并将提交推送到按照本指南配置的远程服务器:使用Git管理网站.

上周我尝试使用Git子模块来管理一些第三方库,今天我尝试推送到服务器,发现在服务器中所有子模块目录都是空的.

我尝试添加并提交对本地子模块的更改,确实git status说工作目录是干净的.

我能做什么?

Cas*_*bel 10

子模块的意思是它们是存储库中的git存储库,而父存储库只知道应该在子模块中检出哪些提交 - 它对内容一无所知.因此,只知道未填充子模块的父项目的服务器自然会在其中看不到任何内容.

您需要在某个时刻初始化服务器上​​的子模块.看起来你的工作树与你的仓库分开了,所以就像那样git checkout -f,你需要适应:GIT_WORK_TREE=/path/to/whatever git submodule update --init.之后,当你的钩子git checkout -f在推动后运行时,它也需要运行git submodule update(再次适当地设置工作树).

但它比这更复杂.您没有提供有关子模块来自何处的任何信息,但子模块知道其来源,就像您的存储库一样.初始化一个时,它会尝试从该原点进行克隆,并且通常需要从该原点进行更新.如果我怀疑,您的第三方库的来源是公共的,您没有推送访问权限,那么您将不得不为子模块设置自己的中央存储库.当您在其中一个子模块中提交时,您将推送到其中央存储库,然后推送父项目,这样当它尝试更新其他地方的子模块时,它就能够获取它们.

所以,回顾一下,工作流程是这样的:

  • 提交第三方子模块(或它的独立克隆)
  • 将第三方库推送到其中央存储库
  • 在父repo中添加子模块(让它知道新的提交)并提交
  • 将父项目推送到其中央仓库
  • parent的中央repo hook检查到你的服务器,并在那里更新子模块


Aur*_*ien 5

正如Jefromi指出的那样,你的子模块需要一个"遥控器"才能被推动.

我想你缺少的一步就是这样

submodule-dir/$ git remote add origin <where to push submodule>

这里有一个简单的例子:Git:推送一个新的子模块


fav*_*tti 2

子模块实际上是一个单独的存储库,它被推送到另一个远程。因此,基本上,当您更改子模块中的某些内容时,您需要在子模块的工作空间中进行推送。此外,在推送到子模块后,您还需要推送主项目。

这里有些例子