我使用 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/