开发者

git pushing submodule

开发者 https://www.devze.com 2023-03-14 00:24 出处:网络
I cloned repository A to repository B using git clone . /somedirectory/b.git . Later on, I decided to submodule repository C in Bgit submodule add /path/to/c.git c_in_b. So how do i push back this add

I cloned repository A to repository B using git clone . /somedirectory/b.git . Later on, I decided to submodule repository C in B git submodule add /path/to/c.git c_in_b. So how do i push back this addition of submodule to A?

Tried using git push but have the following error

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, th开发者_如何学Pythonis 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'.


This is because you are trying to push to a non-bare repository. Make bare repositories to push to first. Just add --bare to the clone command.

The reason this happens is to prevent loss of work. Having a working dir implies that you may lose work if a branch is going to be updated externally.


Like the other answers point out, there seems to be some confusion between repositories as working copies, and repositories as bare repositories (~servers).

Your best bet is to mentally distinguish these two. Working copies are a place where you implement changes, commit them and push them to a "server repository". Server repositories are usually bare repositories for exactly the reason you can see when trying to push. The working copy might contain changes which would get clobbered by modifying the underlying .git-directory in the working copy.

The easiest way to fix this, is most probably to point the remote repositories to the "server repository", i.e. bare repository keeping the changes. If you don't have the server repos yet, you might want to create them for the modules. After this you can do

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

for both the submodule and the top repo.


This is the genereal behaviour of git, even when submodules are not in the picture. You are pushing to a repo ( A ) which is a "working repository" or "non-bare" and git by default doesn't allow you to do that and the error message you see shows the reasons and workaround for it.

In your case, I think you can update the config in A ( set receive.denyCurrentBranch as warn or ignore ) as the error suggest or just checkout another branch on A and then push from B. For long term use, use a bare repo for pushing.

0

精彩评论

暂无评论...
验证码 换一张
取 消