git推子模块

时间:2011-06-20 16:50:08

标签: git

我使用git clone . /somedirectory/b.git将存储库A克隆到存储库B.后来,我决定在B git submodule add /path/to/c.git c_in_b中子模块化存储库C.那么我如何将这个子模块的添加推回到A?

尝试使用git push,但出现以下错误

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable t
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in som
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, se
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

3 个答案:

答案 0 :(得分:3)

这是因为您正在尝试推送到非裸存储库。将裸存储库推送到第一位。只需在clone命令中添加--bare即可。

发生这种情况的原因是为了防止失去工作。拥有一个工作目录意味着如果要在外部更新分支,您可能会失去工作。

答案 1 :(得分:2)

正如其他答案所指出的那样,存储库之间似乎存在一些混淆,即作为工作副本,存储库作为裸存储库(〜服务器)。

你最好的选择是在心理上区分这两者。工作副本是您实施更改,提交更改并将其推送到“服务器存储库”的位置。服务器存储库通常是裸存储库,这正是您在尝试推送时可以看到的原因。工作副本可能包含通过修改工作副本中的基础.git目录而遭到破坏的更改。

解决此问题的最简单方法是将远程存储库指向“服务器存储库”,即保留更改的裸存储库。如果您还没有服务器存储库,则可能需要为模块创建它们。在此之后你可以做到

git remote rm origin
git remote add origin ssh://username@remote_repository

用于子模块和顶部回购。

答案 2 :(得分:1)

这是git的基本行为,即使子图像不在图片中。你正在推送一个repo(A),这是一个“工作存储库”或“非裸”,默认情况下git不允许你这样做,你看到的错误信息显示了它的原因和解决方法。

在您的情况下,我认为您可以更新A中的配置(将receive.denyCurrentBranch设置为warnignore)作为错误建议,或者只是检查A上的另一个分支,然后推送来自B.长期使用,请使用裸仓来推动。