推送Git中的子模块更改

时间:2012-05-24 20:45:09

标签: git git-submodules

我有一个Git子模块,我已成功克隆到我的主项目中。但是,当我在子模块中进行更改并尝试将它们推回到原始子模块存储库时,Git拒绝执行此操作。为什么,我该如何解决这个问题?

示例:我有两个单独的文件夹中的项目子和项目超级。我把sub作为super下的子模块。我在文件夹super / sub中进行更改,然后尝试将这些更改推送到原始项目子。 Git抱怨道。

编辑:关于错误消息,我在Windows上使用Git Bash,但遗憾的是无法从终端中获取确切的错误消息。这是最相关的部分:

  

remote:错误:拒绝更新签出的分支:refs / heads / master。默认情况下,拒绝更新非裸存储库中的当前分支,因为它会使索引和工作树与您推送的内容不一致,并且需要'git reset --hard'才能将工作树与HEAD匹配。 / p>

注意:两个存储库都存在于我的硬盘上。

1 个答案:

答案 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".