我有与git子模块相关的复杂问题/案例。我在github和第三方子模块上有自己的回购(由其他公司提供,只读)。我处理了init子模块,更新它,添加.gitsubmodule和新文件夹到master repo等等 - 一切正常。现在我想在子模块文件中进行一些更改,将新文件添加到子模块或类似的东西。我做了它,然后我从子模块目录级执行提交。我将文件夹更改为master repo,git status显示我在submodule文件夹中的uncommited提交。所以... git commit -a
,git push
。 (当我在子模块目录中检查git状态时,我得到的信息是你的分支在X提交之前超过'origin / master'。)
当我从github进行我的repo的递归克隆时,我收到错误(我想是由子模块的变化引起的):
fatal: reference is not a tree: c19485a57b5152959b9a916409ad5d901c44741d
Unable to checkout 'c19485a57b5152959b9a916409ad5d901c44741d' in submodule path 'apt'
所以,我的问题是:
答案 0 :(得分:0)
我想你忘了从子模块里面运行git push
。这必须在推送封闭项目中的提交之前完成,否则任何人都无法检查更新的子模块(因为远程提交不存在)。
答案 1 :(得分:0)
问题是您要更改您没有推送访问权限的第三方存储库。解决方案是创建自己的存储库克隆 - 当您进行编辑时,您应该在该子库的上下文中提交它们并推送它们。外部存储库跟踪子模块的状态,但不应管理对子模块文件的更改。
因此,工作流程解决方案是拥有自己的第三方仓库克隆,您可以对其进行推送访问。您应该将自己的repo版本作为子模块添加到项目中。我认为这个answer将有助于澄清使用子模块的正确方法上的一些混淆(有时这无疑是有点棘手)。