Search code examples
gitrepositorygit-bare

What's the -practical- difference between a Bare and non-Bare repository?


I've been reading about the bare and non-bare / default repositories in Git. I haven't been able to understand quite well (theoretically) the differences between them, and why I should "push" to a bare repository. Here's the deal:

Currently, I'm the only one working on a project on 3 different computers, but there will be more people involved in it later, so I'm using Git for the version control. I clone the bare repo on all computers, and when I finish my modifications on one of them, I commit and push the changes to the bare repo. From what I've read, the bare repository does NOT have a "working tree", so if I clone the bare repo, I won't have a "working tree".

I'm guessing that the working tree stores the commit information, branches, etc. from the project. That wouldn't appear in the bare repo. So it seems better for me to "push" the commits to the repo with the working tree.

Then, why should I use the bare repository and why not? What's the practical difference? That would not be beneficial to more people working on a project, I suppose.

What are your methods for this kind of work? Suggestions?


Solution

  • Another difference between a bare and non-bare repository is that a bare repository does not have a default remote origin repository:

    ~/Projects$ git clone --bare test bare
    Initialized empty Git repository in /home/derek/Projects/bare/
    ~/Projects$ cd bare
    ~/Projects/bare$ git branch -a
    * master
    ~/Projects/bare$ cd ..
    ~/Projects$ git clone test non-bare
    Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
    ~/Projects$ cd non-bare
    ~/Projects/non-bare$ git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/master
    

    From the manual page for git clone --bare:

    Also the branch heads at the remote are copied directly to corresponding local branch heads, without mapping them to refs/remotes/origin/. When this option is used, neither remote-tracking branches nor the related configuration variables are created.

    Presumably, when it creates a bare repository, Git assumes that the bare repository will serve as the origin repository for several remote users, so it does not create the default remote origin. What this means is that basic git pull and git push operations won't work since Git assumes that without a workspace, you don't intend to commit any changes to the bare repository:

    ~/Projects/bare$ git push
    fatal: No destination configured to push to.
    ~/Projects/bare$ git pull
    fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
    ~/Projects/bare$