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

标签 git git-submodules

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

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

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

我能做什么?

最佳答案

子模块的 Gist 是它们是存储库中的 git 存储库,父存储库只知道应该在子模块中 check out 什么提交——它对内容一无所知。因此,服务器只知道没有填充子模块的父项目,自然不会在其中看到任何内容。

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

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

因此,回顾一下,工作流程是这样的:

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

关于Git:如何将子模块推送到远程存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8372625/

相关文章:

git - 绕过 merge 提交的预提交 Hook

git - 如何获取 Maven 版本以克隆 git 子模块?

GNU screen 中的 Git 推送失败

git - Bitbucket 将功劳归功于错误的人

git - 独立的开发和部署 git 存储库

git - 某些 git 路径的权限被拒绝

父文件夹中的 Git 子模块

git - 有没有办法避免 ssh 配置中的默认 git 用户?

git - 无法完成 Git Rebase

git - git 子模块的不同推/pull url