Fetch from origin in Bare Repository in Git does not create “remote branch”
First of all, I know how I can update my Bare Repository. I want to know why when my current repository is
bare and I
fetch from a remote repository, git creates
remote (tracking) branches except of when I fetch from
I tried this experiment:
I have three directories in current directory:
$ cd ./origin $ git init $ cat > 1 ^Z $ git add 1 $ git commit -m "add 1 in initial commit" $ cd ../bare_clone $ git clone --bare ../origin $ cd ../remote $ git init $ cat > 1 ^Z $ git add 1 $ git git commit -m "add 1 in initial commit" $ git branch test $ cd ../bare_clone/origin.git/ $ git remote add remote_name ../../remote/ ____________________________________________ $ git fetch remote_name warning: no common commits remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From ../../remote * [new branch] master -> remote_name/master * [new branch] test -> remote_name/test ____________________________________________ $ git branch -a * master remotes/remote_name/master remotes/remote_name/test ____________________________________________ $ cd ../../origin/ $ git branch origin_test_branch ____________________________________________ $ cd ../bare_clone/origin.git/ t$ git fetch origin From path/to/bare_clone/../origin * branch HEAD -> FETCH_HEAD ____________________________________________ $ git branch -a * master remotes/remote_name/master remotes/remote_name/test
You can see two remote branches are created for tracking branches of
remote_name repository but there is no remote branch for tracking branch
One Solution collect form web for “Fetch from origin in Bare Repository in Git does not create “remote branch””
--bare clone is generally intended as a recipient for push operations (and nothing else), so it’s not really expected to do fetches.
If you look at the
config file of a
--bare clone you will see:
$ cat config [core] repositoryformatversion = 0 filemode = true bare = true [remote "origin"] url = ...
Note the lack of a
fetch = line in the
[remote "origin"] section. This means that no references are to be copied by default when doing
git fetch (since the references copied are those listed in the
fetch = lines).
Compare this with, e.g.,
git clone --mirror:
$ cat config [core] repositoryformatversion = 0 filemode = true bare = true [remote "origin"] url = ... fetch = +refs/*:refs/* mirror = true
which says to overwrite all refs with those obtained from remote
origin on fetch operations. Note that this picks up
refs/notes/* automatically (since it gets every
You could want the normal “copy only branches, and rename branches while copying” behavior that you get with a non-bare clone. If so you must add the proper
fetch = line after creating the bare repository:
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
However, be aware that
git fetch may also bring over some (but not all) tags during such a fetch (I’m not sure if
git fetch special-cases bare clones here). Since tags do not undergo renaming, this may not be what you want (but then again it may be, you must think about this and decide for yourself).