I have a server on which I have a bare repository for pushing. However, my server needs to have a working copy of the master branch.
How do I get a working copy and that only from a bare repository?
I have a server on which I have a bare repository for pushing. However, my server needs to have a working copy of the master branch.
How do I get a working copy and that only from a bare repository?
You can simply clone the repository to another directory on the same machine:
git clone /bare/repo/dir
The current directory will become a non-bare clone of your repo, and you'll get a checkout of the master
branch automatically. Then use the usual commands like git pull
to update it as needed.
As a side benefit, this operation is very efficient — if you specify a local directory to git clone
, git will use hard links to share the read-only parts of the object databases of the two repos.
A bare repository is just the .git directory of a working directory, and an entry in the local config file. What I did to convert a bare repository into a full one is:
.git
and move all files from the bare repository in there.git/config
file to change bare = true
to bare = false
You could set the Hidden attribute on the .git
directory on Windows, but not on the files inside the directory.
I was looking for the "detached working tree" approach (as seen here):
git init --bare
git config core.bare false
git config core.worktree /somewhere/else/
git checkout -f
This works for me:
git --git-dir=path-to-bare-repo.git --work-tree=path-to-target checkout master .
this command will extract all files from the repository to the directory specified by path-to-target
This is how it works:
$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .
Voilà!
For info: git init
will report: Reinitialized existing Git repository in /path/to/existing-bare-repository
. But be confident. man git-init
says:
Running git init in an existing repository is safe. It will not overwrite things that are already there.
The magic is that git init
alone does not make your files appear in the working directory. You have to checkout the root directory.
This is a riff off the other 2 answers but it fills the gap for my use case -- it works for updating the repo from the origin and checking out branches and any git operation because you end up with a normal complete git repo.
git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url origin git@github.com:swift/swift.git
After executing these 3 lines of code you can then git pull
and git branch
and git checkout some_branch
and so on because you now have a normal complete git repo connected to your remote repo.
Also consider using
https://git-scm.com/docs/git-worktree
it should allow to create a local working copy from a bare repo without the need of cloning it (this can save space if the repo is a big one)
You can use 'git show' for this.
http://www.kernel.org/pub/software/scm/git/docs/git-show.html
Basically:
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file.txt