Git push/pull on the LAN


pmprog

DNF (Did Not Finish)
Joined
Apr 25, 2011
Messages
4,150
This might seem a bit of a silly question, but I can't work out what I need to do. Maybe I'm searching for the wrong thing.

Basically, what I'm after doing is making a git repo on one machine, and push/pull to it from other computers on the LAN (like my Pandy, and laptop). All machines run a form of Linux (though I'm tempted to reinstall Windows on the laptop, because the wifi is super flaky under linux).

When I do all this manually, when I send a push, I get the following
Code:
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 to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
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 some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
 
You are trying to push to a repository that is not 'bare', i.e. it has a working directory. There are various options. The most popular are probably to either have a 'intermediate server repository' where the git repository is created using git init --bare and you push/pull from this from/to your working repositories on your different machines, or alternatively use a separate branch in the repository to push/pull (e.g. configure a branch named 'shared' or something that is pushed/pulled between the different working copies and updated explicitly using git branch -f shared master). Personally I've only used the first variant, so YMMV.
 
Yeah, IIRC I ended up doing what the error suggests, and set my receive.denyCurrentBranch to ignore. That has caused a few issues in the past, whereby I've ended up testing an old release on the server because I forgot to catch up on that machine. But these days, I mostly switch the machine on and code remotely over ssh, because my laptop's developed a habit of umounting my home directory randomly, and on the server I've got it to reconnect to my old tmux session automatically, so once I've rebooted my laptop and power cycled it to get the drive back it's still there where I left it.
 
Best option is just to make a bare repo in the server machine. Could even make it from the existing one:
Code:
git clone --bare /path/to/.git

Another option is to manually control which branch you are pushing/fetching from:
Code:
git push origin refs/heads/master:refs/heads/shared

git fetch origin refs/heads/shared:remotes/origin/master
git checkout master
git merge --ff-only origin/master
 
Great, thanks everyone. I'll give the bare repo a go :)
 
Back
Top