本地提交到git子模块

本地提交到git子模块,git,git-submodules,Git,Git Submodules,我有一个git项目,其中包含一个git子模块,我从一个公共只读存储库中克隆了它(即,我无法推送到该存储库)。是否可以提交到该子模块?下面是我如何尝试这样做的 [main]$ cd sub [sub]$ git checkout master [sub]$ echo test > new-file [sub]$ git add new-file [sub]$ git commit -m 'added a new file' [sub]$ cd .. [main]$ git add sub [

我有一个git项目,其中包含一个git子模块,我从一个公共只读存储库中克隆了它(即,我无法推送到该存储库)。是否可以提交到该子模块?下面是我如何尝试这样做的

[main]$ cd sub
[sub]$ git checkout master
[sub]$ echo test > new-file
[sub]$ git add new-file
[sub]$ git commit -m 'added a new file'
[sub]$ cd ..
[main]$ git add sub
[main]$ git push origin
到目前为止还不错。现在的问题是,当我转到另一台计算机时,我会执行以下操作:

[main]$ git pull
[main]$ git submodule update

但是它失败了,因为
致命:引用不是树:af232…
。我认为这会起作用,因为当我在main中执行
git push origin
时,它似乎也会为子模块推送所有对象(毕竟它们位于main的.git目录中)。但显然,当第二台计算机拉取时,它不会接收这些新对象。

这是因为您在超级项目中推送了子模块更改,但您没有推送子模块中发生的实际更改(
git push origin
不推送子模块更改,只有它的commit SHA1。)。这不是你能做的,因为它是只读回购协议


您可以做的是将子模块的URL更改为您自己的存储库,将更改推送到它,然后在超级项目中提交并推送URL更改

是的,我知道。这正是我在这里试图避免的。如果我这样做,那么我将无法跟踪“上游”存储库(我从中克隆子模块的存储库)。如果您没有写访问权限,那么就没有其他方法可以这样做。您仍然可以通过从克隆中提取并推送到镜像repo来跟随上游。