我有一个Git子模块,我已成功克隆到我的主项目中。但是,当我在子模块中进行更改并尝试将它们推回到原始子模块存储库时,Git拒绝执行此操作。为什么,我该如何解决这个问题?
示例:我有两个单独的文件夹中的项目子和项目超级。我把sub作为super下的子模块。我在文件夹super / sub中进行更改,然后尝试将这些更改推送到原始项目子。 Git抱怨道。
编辑:关于错误消息,我在Windows上使用Git Bash,但遗憾的是无法从终端中获取确切的错误消息。这是最相关的部分:
remote:错误:拒绝更新签出的分支:refs / heads / master。默认情况下,拒绝更新非裸存储库中的当前分支,因为它会使索引和工作树与您推送的内容不一致,并且需要'git reset --hard'才能将工作树与HEAD匹配。 / p>
注意:两个存储库都存在于我的硬盘上。
答案 0 :(得分:4)
这与repo是一个子模块无关。
你正在推送一个带有工作副本的git仓库(非裸仓库),并且正在尝试推送到当前签出的同一分支 - 默认情况下git不允许你这样做。
在继续之前,你应该问问自己是否真的想这样做。这类似于,让我们说你直接克隆同事回购然后试图推动它。如果您成功了,如果他们有未提交的更改,您可能会导致您的同事失去工作,或者更新后的本地文件将被跟踪的文件覆盖。
轻松解决方案
最简单的解决方案是不要完全推动而只是从你的其他仓库拉出来。最终的结果是一样的,但由于你正在提取更新(而且这很正常),git不会对此有任何说明。
稍微不那么简单的解决方案
你可以推送到你的其他工作副本,如果你改变接收repo的git配置(阅读其余的错误消息)以允许它被推入。为此,在收货回购中:
git config receive.denyCurrentBranch ignore
有关详细信息,请参阅帮助(git config --help
)
receive.denyCurrentBranch
If set to true or "refuse", git-receive-pack will deny a ref update to the
currently checked out branch of a non-bare repository. Such a push is potentially
dangerous because it brings the HEAD out of sync with the index and working tree.
If set to "warn", print a warning of such a push to stderr, but allow the push to
proceed. If set to false or "ignore", allow such pushes with no message. Defaults
to "refuse".