On Thu, 16 Nov 2006, Han-Wen Nienhuys wrote:
This is not about CVS or SVN, so don't put them up as a strawman.
If you want to argue that my brain is warped, use other distributed VCs as an
example.
Your example has nothing at all to do with "pull" vs "fetch", though.
Your example is about something totally _different_, namely that under
git, "git init-db" is _only_ for creating a _new_ project.
The following
mkdir x y
cd x
hg init
echo hoi > bla
hg add
hg commit -m 'yes, I am also too stupid to refuse explicit empty commit messages'
cd ../y
hg init
hg pull ../x
pretty much works the same in Darcs, bzr and mercurial.
With GIT, this is what happens
[hanwen@haring y]$ git pull ../x
Bzzt. This is where you went wrong, and you blamed "pull".
The way you do this in git is to NOT do "git init". Instead, you replace
all the
mkdir y
cd ../y
hg init
hg pull ../x
with a simple
git clone x y
and YOU ARE DONE.
Now, we could certainly _make_ "git pull" work on an empty git project,
but that has _nothing_ to do with what people have been talking about.
In fact, the fact that "git fetch" kind of works is not exactly accidental
(because "git fetch" _is_ meant to add new local branches too), but all
the problems you have with it are due to the SAME issue. You started
without any branch at all, because you started with an empty git repo, and
you're simply not _supposed_ to do that.
So current rule (and this is not new, it's always been true): the ONLY
time you use "git init-db" is when you are going to start a totally new
project. Never _ever_ otherwise. If you want to track another project, use
"git clone".
This might not be typical GIT use, but it does show the typical GIT user
experience, at least mine.
It's not that it isn't typical, it's that you are using the wrong model.
Maybe it's not well documented, I can easily give you that, but ALL your
problems come from that fundamental starting point: you shouldn't have
used "git init-db" in the first place.
Somebody want to document it?
Alternatively, we certainly _could_ make "git pull" just accept an empty
git repo, and make it basically create the current branch.
(And we probably should improve the error messahe)
I don't want ANYTHING to really change, I just want a sane interface to it.
The sane interface _exists_. It's called "git clone".