Git子模块(再一次)

时间:2012-08-23 21:34:10

标签: git git-submodules

我有与git子模块相关的复杂问题/案例。我在github和第三方子模块上有自己的回购(由其他公司提供,只读)。我处理了init子模块,更新它,添加.gitsubmodule和新文件夹到master repo等等 - 一切正常。现在我想在子模块文件中进行一些更改,将新文件添加到子模块或类似的东西。我做了它,然后我从子模块目录级执行提交。我将文件夹更改为master repo,git status显示我在submodule文件夹中的uncommited提交。所以... git commit -agit push。 (当我在子模块目录中检查git状态时,我得到的信息是你的分支在X提交之前超过'origin / master'。)

当我从github进行我的repo的递归克隆时,我收到错误(我想是由子模块的变化引起的):

fatal: reference is not a tree: c19485a57b5152959b9a916409ad5d901c44741d 
Unable to checkout 'c19485a57b5152959b9a916409ad5d901c44741d' in submodule path 'apt'

所以,我的问题是:

  1. 我可以在子模块中进行更改并将它们(和跟踪)推送到github。
    • 如果是的话,我必须做什么,我可以把我的所有repo与子模块和其中的更改拉到另一个主机(某些工作流程?)。
    • 如果没有,我怎么能绕过子模块中的变化,从我的github repo级别看到它们并拉到另一个主机
  2. 尽可能吗?

2 个答案:

答案 0 :(得分:0)

我想你忘了从子模块里面运行git push。这必须在推送封闭项目中的提交之前完成,否则任何人都无法检查更新的子模块(因为远程提交不存在)。

答案 1 :(得分:0)

问题是您要更改您没有推送访问权限的第三方存储库。解决方案是创建自己的存储库克隆 - 当您进行编辑时,您应该在该子库的上下文中提交它们并推送它们。外部存储库跟踪子模块的状态,但不应管理对子模块文件的更改。

因此,工作流程解决方案是拥有自己的第三方仓库克隆,您可以对其进行推送访问。您应该将自己的repo版本作为子模块添加到项目中。我认为这个answer将有助于澄清使用子模块的正确方法上的一些混淆(有时这无疑是有点棘手)。