我使用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'.
答案 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
设置为warn
或ignore
)作为错误建议,或者只是检查A上的另一个分支,然后推送来自B.长期使用,请使用裸仓来推动。