I have a bare git repository, but need to access and browse its contents over ssh (in a file manager like user experience).
I assume I could clone it:
git clone -l <path_to_bare_repo> <new_normal_repo>
However, my repository is about 20GB in size and I don't have the space to duplicate it. Is there a way to convert the bare repository in-place to end up with a working copy in it?
A non-bare repository doesn't necessarily have a default remote "origin", either. You can create a Git repository simply with git init , which will create a non-bare repo with no remote specified.
What is a bare repository? A bare repository is the same as default, but no commits can be made in a bare repository. The changes made in projects cannot be tracked by a bare repository as it doesn't have a working tree. A working tree is a directory in which all the project files/sub-directories reside.
Note: I tested this on a very simple 1-commit repository. Double-check this, read the man pages, and always be happy you've backed up before following advice you found on StackOverflow. (You do back up, right?)
To convert a --bare
repository to a non-bare:
.git
folder in the top-level of your repository.HEAD branches config description hooks info objects refs
etc.) into the .git
you just created.git config --local --bool core.bare false
to convert the local git-repository to non-bare.master
(or whichever your main branch is) and all your files are deleted and the deletion is staged. That's normal. Just manually checkout master
, or do a git reset --hard
, and you are done..git/config
file adding line fetch = +refs/heads/*:refs/remotes/origin/*
after url = <...>
in [remote "origin"]
section. Otherwise git fetch
will not see origin/master
and other origin's branches.These steps are in the opposite direction of this question, "git-convert normal to bare repository" - in particular note this answer, which states that the above steps (in, I presume, either direction) is different from doing a git-clone
. Not sure if that's relevant to you, though, but you mentioned git clone
in the question.
I had a slightly different scenario:
Solution:
.git
dir:git clone --bare https://github.com/user/project .git
git config --local --bool core.bare false
.git
bare repo doesn't include a file 'index
'.)git reset HEAD -- .
.git/index
.I have effectively transformed a bare repo into a non-bare one, while preserving the content I had previously got.
The full script I have been using for years involves the steps:
cd /path/to/current/worktree # That creates a .git directly at the right place git clone --bare /url/of/repo .git # restore the link between the local repo and its upstream remote repo git config --local --bool core.bare false git config --local remote.origin.fetch +refs/heads/*:refs/remotes/origin/* git fetch origin git branch -u origin/master master # reset the index (not the working tree) git reset HEAD -- .
But I do recon the accepted solution (with the helpful git reset
step added by ADTC) is simpler.
If 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