First off, apologies as I'm new to git, ssh and Xcode. Also, I'm a rather command line phobic.
We have a server running where clients connect with ssh authentication pull/push code from/to. It works beautifully from Xcode 4 for existing projects which I had setup using git command line. It's really simple to clone projects from there using Xcode 4 and push commits.
What I'm confused about is how to set our server as the origin/master for local git projects that developers had created with Xcode 4 (with a lot of checkin history). I see there is a hidden .git folder, so I tried:
scp -r .git [email protected]:MyProject.git
Then from Xcode 4, I can go ahead and clone it from our server perfectly. I can see the full checkin history. If I try to push changes though, i get a huge error message.
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: 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'.
[snip]
I'm at a loss for how to properly do this without losing the precious checkin history that developers already have on their local machines.
Can someone point out the fundamental step or concept I'm missing?
Thanks!
If you want to push to a repo, it's forbidden by default to push to a branch that is currently checked out.
To avoid this, central repos (those where everyone pushes to) are usually created as bare repos, i.e. they contain only the versioning information and no checked out working copy. These repos are by convention named <repo-name>.git. You can create a bare repo using the --bare flag on git init
git init --bare myrepo.git
But the problem is that you copied a local .git folder to my.server.com instead of creating a bare repo there. In .git/config, there's the information whether the repo is bare or not. In working copies, bare is false, this information is now on the server.
The correct way to get around this would be to
remote in your working copygit remote add origin [email protected]:MyProject.git origingit push --force --all originIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With