git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* basics... when reading docs doesn't help
@ 2007-03-29 20:50 Guennadi Liakhovetski
  2007-03-29 21:16 ` J. Bruce Fields
  0 siblings, 1 reply; 18+ messages in thread
From: Guennadi Liakhovetski @ 2007-03-29 20:50 UTC (permalink / raw)
  To: git

Hi all

Since it's a basic question, I couldn't search archives - cannot come up 
with good enough search keywords, but would be greatful for pointers.

I've been using CVS for a few years now, briefly tried a couple of other 
CMS, but only briefly. Now trying to get to grisps with the git... And 
just cannot understand how everybody does it.

The package I'm trying to handle with git is the Linux kernel.

1. Ok, I clone a repository from Linus or some else.

2. as my internet connection is not very fast, although I do have 
flatrate, I prefer keeping a virgin cloned copy somewhere, where I only do 
pulls from the original clone source, no edits.

3. then I do git clone <path to original cloned tree> <new tree>

4. create a new branch in <new tree>

5. go hack / compile in the <new tree>

6. then I decide to build practically the same kernel for another machine, 
i.e., another configuration, maybe a couple of local changes...

Now, that's the first question: suppose I want to build kernels for about 
4 machines. Do you __really__ clone the whole tree 4 times??? And then I 
want try new versions for the same 4 machines without deleting the first 
ones - 4 more clones??? Now, my copy of Linus' tree was ATM 1.5GiB big... 
Slowly it's getting scary. Ok, if I build all that stuff on one 
filesystem, I can use --local to use hard links, right? But is it REALLY 
what everybody does?

The next thing is - I don't need all versions since 2.6.x in every copy I 
use to compile / test / hack - in most cases I only compare to the basis 
version, from which I branched. I might pull further updates into this 
repository, merge, etc., but I don't need all PAST commits! Can I clone 
starting from version x?

Ok, enough for starters:-)

Thanks
Guennadi
---
Guennadi Liakhovetski

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 20:50 basics... when reading docs doesn't help Guennadi Liakhovetski
@ 2007-03-29 21:16 ` J. Bruce Fields
  2007-03-29 21:26   ` Junio C Hamano
  2007-03-29 22:27   ` Matthieu Moy
  0 siblings, 2 replies; 18+ messages in thread
From: J. Bruce Fields @ 2007-03-29 21:16 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: git

On Thu, Mar 29, 2007 at 10:50:51PM +0200, Guennadi Liakhovetski wrote:
> Now, my copy of Linus' tree was ATM 1.5GiB big...  Slowly it's getting
> scary.

On my laptop:

[bfields@pad linux]$ du -hs .
1.5G    .
[bfields@pad linux]$ du -hs .git
334M    .git

So it's mostly the checked out working directory and build
stuff.

If you really need a ton of build trees then you might just want to do
cp -al or something.

--b.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 21:16 ` J. Bruce Fields
@ 2007-03-29 21:26   ` Junio C Hamano
  2007-03-29 21:46     ` J. Bruce Fields
  2007-03-29 22:27   ` Matthieu Moy
  1 sibling, 1 reply; 18+ messages in thread
From: Junio C Hamano @ 2007-03-29 21:26 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Guennadi Liakhovetski, git

"J. Bruce Fields" <bfields@fieldses.org> writes:

> On Thu, Mar 29, 2007 at 10:50:51PM +0200, Guennadi Liakhovetski wrote:
>> Now, my copy of Linus' tree was ATM 1.5GiB big...  Slowly it's getting
>> scary.
>
> On my laptop:
>
> [bfields@pad linux]$ du -hs .
> 1.5G    .
> [bfields@pad linux]$ du -hs .git
> 334M    .git
>
> So it's mostly the checked out working directory and build
> stuff.
>
> If you really need a ton of build trees then you might just want to do
> cp -al or something.

How about suggesting "clone -l -s"?

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 21:26   ` Junio C Hamano
@ 2007-03-29 21:46     ` J. Bruce Fields
  2007-03-29 22:13       ` Guennadi Liakhovetski
  0 siblings, 1 reply; 18+ messages in thread
From: J. Bruce Fields @ 2007-03-29 21:46 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Guennadi Liakhovetski, git

On Thu, Mar 29, 2007 at 02:26:10PM -0700, Junio C Hamano wrote:
> "J. Bruce Fields" <bfields@fieldses.org> writes:
> 
> > On Thu, Mar 29, 2007 at 10:50:51PM +0200, Guennadi Liakhovetski wrote:
> >> Now, my copy of Linus' tree was ATM 1.5GiB big...  Slowly it's getting
> >> scary.
> >
> > On my laptop:
> >
> > [bfields@pad linux]$ du -hs .
> > 1.5G    .
> > [bfields@pad linux]$ du -hs .git
> > 334M    .git
> >
> > So it's mostly the checked out working directory and build
> > stuff.
> >
> > If you really need a ton of build trees then you might just want to do
> > cp -al or something.
> 
> How about suggesting "clone -l -s"?

If you really want to share as much as possible, then I guess you want
to share the working trees too, since (as evidenced above), they're at
least as large as the compressed history.

Though actually on a second look, clone -l -s produces something that's
only 377M.  I hadn't realized how much space the build output takes up.
So judging from du the 1.5G Guennadi Liakhovetski mentions above seems
to break down into something like:

	330M .git
	380M working tree
	750M build output

--b.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 21:46     ` J. Bruce Fields
@ 2007-03-29 22:13       ` Guennadi Liakhovetski
  2007-03-29 22:35         ` Linus Torvalds
                           ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Guennadi Liakhovetski @ 2007-03-29 22:13 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Junio C Hamano, git

On Thu, 29 Mar 2007, J. Bruce Fields wrote:

> On Thu, Mar 29, 2007 at 02:26:10PM -0700, Junio C Hamano wrote:
> > 
> > How about suggesting "clone -l -s"?

Yes, but how do "advanced git users" kernel developers work? Do they just 
do 1 clone and build / clean every time they want to test another 
configuration / arch, or do they clone -l or what? Do they create branches 
for each development thread, then pull / push between trees?...

> If you really want to share as much as possible, then I guess you want
> to share the working trees too, since (as evidenced above), they're at
> least as large as the compressed history.

But I don't want to re-build. Apart from i386 I build for a couple of ARM 
and PPC targets too...

> Though actually on a second look, clone -l -s produces something that's
> only 377M.  I hadn't realized how much space the build output takes up.
> So judging from du the 1.5G Guennadi Liakhovetski mentions above seems
> to break down into something like:
> 
> 	330M .git
> 	380M working tree
> 	750M build output

Strange. Is my git 1.4.0 criminally broken? I have a clone of Linus' tree 
on a USB disk on ext3 without any objects, which I just cloned at some 
point and then did a couple of pulls from the same source. Now

1545084 /mnt/sda2/kernel-git/linux-2.6/
1255084 /mnt/sda2/kernel-git/linux-2.6/.git

Interestingly, both end up with 5084. For comparison:

465044  /mnt/sda2/kernel-git/powerpc
174980  /mnt/sda2/kernel-git/powerpc/.git

But that's a freshly cloned tree, without any pulls. I re-cloned it, 
because the tree I had earlier had the problem with each pull:

Unpacking 12452 objects
 100% (12452/12452) done
* refs/heads/origin: does not fast forward to branch 'master' of 
git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc;
  not updating.

Wonderful and strange git world...

Thanks
Guennadi
---
Guennadi Liakhovetski

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 21:16 ` J. Bruce Fields
  2007-03-29 21:26   ` Junio C Hamano
@ 2007-03-29 22:27   ` Matthieu Moy
  1 sibling, 0 replies; 18+ messages in thread
From: Matthieu Moy @ 2007-03-29 22:27 UTC (permalink / raw)
  To: git

"J. Bruce Fields" <bfields@fieldses.org> writes:

> If you really need a ton of build trees then you might just want to do
> cp -al or something.

But be careful that this is a potentially dangerous optimization : if
you ever use a command that doesn't break hardlinks (for example
"echo foo >> file"), the modification is applied to both trees.

-- 
Matthieu

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 22:13       ` Guennadi Liakhovetski
@ 2007-03-29 22:35         ` Linus Torvalds
  2007-03-30 18:16           ` Guennadi Liakhovetski
  2007-03-30  2:43         ` Theodore Tso
  2007-03-30 18:02         ` Andreas Herrmann
  2 siblings, 1 reply; 18+ messages in thread
From: Linus Torvalds @ 2007-03-29 22:35 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: J. Bruce Fields, Junio C Hamano, git



On Fri, 30 Mar 2007, Guennadi Liakhovetski wrote:
> > > 
> > > How about suggesting "clone -l -s"?
> 
> Yes, but how do "advanced git users" kernel developers work? Do they just 
> do 1 clone and build / clean every time they want to test another 
> configuration / arch, or do they clone -l or what? Do they create branches 
> for each development thread, then pull / push between trees?...

I suspect it depends on the developer.

I end up just using different branches and switching between them, but 
then, my branches tend to all be pretty small test-stuff (I only end up 
using one main branch, since 99% of what I do is merge other peoples stuff 
that has already gone through a test-cycle).

> But I don't want to re-build. Apart from i386 I build for a couple of ARM 
> and PPC targets too...

You're probably fine with "git clone -l -s" then.

> Strange. Is my git 1.4.0 criminally broken? I have a clone of Linus' tree 
> on a USB disk on ext3 without any objects, which I just cloned at some 
> point and then did a couple of pulls from the same source. Now
> 
> 1545084 /mnt/sda2/kernel-git/linux-2.6/
> 1255084 /mnt/sda2/kernel-git/linux-2.6/.git

The old git that always exploded all pulls and generated lots of loose 
objects? You can check with "git count-objects".

And to fix it, just do a "git gc" (or with older git versions, the secret 
handshake is just a simple "git repack -a -d").

> But that's a freshly cloned tree, without any pulls. I re-cloned it, 
> because the tree I had earlier had the problem with each pull:
> 
> Unpacking 12452 objects
>  100% (12452/12452) done
> * refs/heads/origin: does not fast forward to branch 'master' of 
> git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc;
>   not updating.

Sounds like either Paul re-based his tree, or you did some work on your 
"origin" branch..

			Linus

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 22:13       ` Guennadi Liakhovetski
  2007-03-29 22:35         ` Linus Torvalds
@ 2007-03-30  2:43         ` Theodore Tso
  2007-03-30 14:49           ` J. Bruce Fields
  2007-03-30 18:02         ` Andreas Herrmann
  2 siblings, 1 reply; 18+ messages in thread
From: Theodore Tso @ 2007-03-30  2:43 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: J. Bruce Fields, Junio C Hamano, git

On Fri, Mar 30, 2007 at 12:13:02AM +0200, Guennadi Liakhovetski wrote:
> On Thu, 29 Mar 2007, J. Bruce Fields wrote:
> > Though actually on a second look, clone -l -s produces something that's
> > only 377M.  I hadn't realized how much space the build output takes up.
> > So judging from du the 1.5G Guennadi Liakhovetski mentions above seems
> > to break down into something like:
> > 
> > 	330M .git
> > 	380M working tree
> > 	750M build output

Hmm.... That doesn't look right.  My packed .git directory is 156 megs
(using post git 1.5 and repack.usedeltabaseoffset=true and
core.legacyheaders=false).

My working tree is 287M, and my build output (size of build tree minus
sources) is 1055M.   (This will vary based on .config options, obviously).

The point though is the size of the .git tree is in the noise compared
to the size of the object files.  I do share the .git repository
between trees; in fact I have a standard "base" repository which is
just a mirror of Linus's tree, and my other kernel repositories have
an .git/objects/info/alternates file which points at the base
repository for maximal sharing.

I could try to share the sources where the source files are identical,
but quite frankly, it's just never been worth the effort.  After all,
when you have a 100gig laptop drive, 287 megs isn't that much, and
it's noise compared to the size of my object files.

> Strange. Is my git 1.4.0 criminally broken? I have a clone of Linus' tree 
> on a USB disk on ext3 without any objects, which I just cloned at some 
> point and then did a couple of pulls from the same source. 

You really, really, *REALLY* want to upgrade to at least git 1.5.0.
It's is *so* much better than git 1.5.0, and it's a lot easier to make
sure your repository is kept packed, using "git gc".  

						- Ted

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30  2:43         ` Theodore Tso
@ 2007-03-30 14:49           ` J. Bruce Fields
  0 siblings, 0 replies; 18+ messages in thread
From: J. Bruce Fields @ 2007-03-30 14:49 UTC (permalink / raw)
  To: Theodore Tso; +Cc: Guennadi Liakhovetski, Junio C Hamano, git

On Thu, Mar 29, 2007 at 10:43:27PM -0400, Theodore Tso wrote:
> On Fri, Mar 30, 2007 at 12:13:02AM +0200, Guennadi Liakhovetski wrote:
> > On Thu, 29 Mar 2007, J. Bruce Fields wrote:
> > > Though actually on a second look, clone -l -s produces something that's
> > > only 377M.  I hadn't realized how much space the build output takes up.
> > > So judging from du the 1.5G Guennadi Liakhovetski mentions above seems
> > > to break down into something like:
> > > 
> > > 	330M .git
> > > 	380M working tree
> > > 	750M build output
> 
> Hmm.... That doesn't look right.  My packed .git directory is 156 megs
> (using post git 1.5 and repack.usedeltabaseoffset=true and
> core.legacyheaders=false).

I haven't run more than git-gc in a while, because I have local clones
and didn't want to figure out how to prune.  Hm, now that I've looked it
up:

git prune -- $(cd ../linux-clone/ && echo $(git-rev-parse --all))

just gets me the git-prune usage message.  In fact, contrary to the
prune man page, git-prune doesn't seem to accept any <head> arguments.
Isn't this a bug?  I'm on 1.5.0.3.31.ge47c.

--b.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 22:13       ` Guennadi Liakhovetski
  2007-03-29 22:35         ` Linus Torvalds
  2007-03-30  2:43         ` Theodore Tso
@ 2007-03-30 18:02         ` Andreas Herrmann
  2007-03-30 18:24           ` Guennadi Liakhovetski
  2 siblings, 1 reply; 18+ messages in thread
From: Andreas Herrmann @ 2007-03-30 18:02 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: J. Bruce Fields, Junio C Hamano, git

On Fri, Mar 30, 2007 at 12:13:02AM +0200, Guennadi Liakhovetski wrote:
> On Thu, 29 Mar 2007, J. Bruce Fields wrote:
> 
> > On Thu, Mar 29, 2007 at 02:26:10PM -0700, Junio C Hamano wrote:
> > > 
> > > How about suggesting "clone -l -s"?
> 
> Yes, but how do "advanced git users" kernel developers work? Do they just 
> do 1 clone and build / clean every time they want to test another 
> configuration / arch, or do they clone -l or what? Do they create branches 
> for each development thread, then pull / push between trees?...
> 
> > If you really want to share as much as possible, then I guess you want
> > to share the working trees too, since (as evidenced above), they're at
> > least as large as the compressed history.
> 
> But I don't want to re-build. Apart from i386 I build for a couple of ARM 
> and PPC targets too...

Seems to be trivial but:
Why don't you use "make O=/foo/bar/arch<x>-config<y>" to put output
files into separate directories? So you can have one source tree and
put each different kernel config and arch into a separate output
directory.

And if you have different sources for you trees put them into branches.

When switching between branches, atime of files are updated accordingly.
So even make should be happy with that.

Just one drawback:
Switching back and forth between two branches will cause
recompilation of sources that differ between that branches -
although nothing might have changed within a branch in the meantime.

(Not that I have used such an setup, yet.
But I think that should work.)


Regards,

Andreas

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-29 22:35         ` Linus Torvalds
@ 2007-03-30 18:16           ` Guennadi Liakhovetski
  2007-03-30 18:48             ` Linus Torvalds
  0 siblings, 1 reply; 18+ messages in thread
From: Guennadi Liakhovetski @ 2007-03-30 18:16 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: J. Bruce Fields, Junio C Hamano, git

On Thu, 29 Mar 2007, Linus Torvalds wrote:

> On Fri, 30 Mar 2007, Guennadi Liakhovetski wrote:
> 
> > Strange. Is my git 1.4.0 criminally broken? I have a clone of Linus' tree 
> > on a USB disk on ext3 without any objects, which I just cloned at some 
> > point and then did a couple of pulls from the same source. Now
> > 
> > 1545084 /mnt/sda2/kernel-git/linux-2.6/
> > 1255084 /mnt/sda2/kernel-git/linux-2.6/.git
> 
> The old git that always exploded all pulls and generated lots of loose 
> objects? You can check with "git count-objects".

Installed 1.5.0.6 and its output of "git count-objects" is

180932 objects, 1112656 kilobytes

git gc removed everything (uh?) and then

linux-2.6$ du -ks .git
183040  .git

cool...

> And to fix it, just do a "git gc" (or with older git versions, the secret 
> handshake is just a simple "git repack -a -d").
> 
> > But that's a freshly cloned tree, without any pulls. I re-cloned it, 
> > because the tree I had earlier had the problem with each pull:
> > 
> > Unpacking 12452 objects
> >  100% (12452/12452) done
> > * refs/heads/origin: does not fast forward to branch 'master' of 
> > git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc;
> >   not updating.
> 
> Sounds like either Paul re-based his tree, or you did some work on your 
> "origin" branch..

It must be the former then:-) Did I have a chance to re-synchronize 
locally to be able to pull normally again or was the only way to re-clone?

Thanks
Guennadi
---
Guennadi Liakhovetski

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30 18:02         ` Andreas Herrmann
@ 2007-03-30 18:24           ` Guennadi Liakhovetski
  0 siblings, 0 replies; 18+ messages in thread
From: Guennadi Liakhovetski @ 2007-03-30 18:24 UTC (permalink / raw)
  To: Andreas Herrmann; +Cc: J. Bruce Fields, Junio C Hamano, git

On Fri, 30 Mar 2007, Andreas Herrmann wrote:

> Seems to be trivial but:
> Why don't you use "make O=/foo/bar/arch<x>-config<y>" to put output
> files into separate directories? So you can have one source tree and
> put each different kernel config and arch into a separate output
> directory.
> 
> And if you have different sources for you trees put them into branches.
> 
> When switching between branches, atime of files are updated accordingly.
> So even make should be happy with that.
> 
> Just one drawback:
> Switching back and forth between two branches will cause
> recompilation of sources that differ between that branches -
> although nothing might have changed within a branch in the meantime.

Exactly, and since I have not only different configs, but also different 
versions, and I don't commit all modifications, so... It would be 
difficult. I think, the setup with "clone -l -s" should be the best.

Thanks to all for ideas
Guennadi
---
Guennadi Liakhovetski

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30 18:16           ` Guennadi Liakhovetski
@ 2007-03-30 18:48             ` Linus Torvalds
  2007-03-30 19:49               ` Guennadi Liakhovetski
  0 siblings, 1 reply; 18+ messages in thread
From: Linus Torvalds @ 2007-03-30 18:48 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: J. Bruce Fields, Junio C Hamano, git



On Fri, 30 Mar 2007, Guennadi Liakhovetski wrote:
> 
> Installed 1.5.0.6 and its output of "git count-objects" is
> 
> 180932 objects, 1112656 kilobytes

Yeah, that is all the loose objects. That's 1.1GB of stuff as loose 
objects, which also likely means that your tree was not only using up too 
much disk-space, it was probably running about ten times slower than than 
it needs to be for many operations.

Using pack-files ends up speeding up a lot of "big" operations a *lot*. If 
all you do is look at individual commits, you'll probably not notice much, 
but even something as simple as running "gitk" with no parameters (which 
will thus traverse the whole history) should be a *lot* faster after it's 
been all re-packed.

> git gc removed everything (uh?) and then

Well, it will generally remove all loose objects, since they get put into 
the pack-files instead. So it didn't remove "everything", but it does 
remove everything that "git count-objects" normally counts (if you give 
count-objects the "-v" flag for verbose output, it will talk about packed 
objects too).

> linux-2.6$ du -ks .git
> 183040  .git
> 
> cool...

That looks about right. Packing generally uses about a tenth of the 
disk-space of loose objects - both from the use of deltas, and from the 
fact that you don't any disk block fragmentation. And because looking at 
objects then doesn't require any system calls any more (just the initial 
"mmap pack and read index" stuff), it ends up being much faster too, 
despite the added overhead of doing the whole delta-chain thing.

> > > Unpacking 12452 objects
> > >  100% (12452/12452) done
> > > * refs/heads/origin: does not fast forward to branch 'master' of 
> > > git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc;
> > >   not updating.
> > 
> > Sounds like either Paul re-based his tree, or you did some work on your 
> > "origin" branch..
> 
> It must be the former then:-) Did I have a chance to re-synchronize 
> locally to be able to pull normally again or was the only way to re-clone?

You need to mark "refs/heads/origin" as always following the remote 
"master", even if it gets re-based.  You do that by adding a "+" before 
the refspec that describes the remote.

These days, with git-1.5.x, "git clone" will do that for you (and make the 
remotes fall under "refs/remotes/origin/*" instead - they're considered 
separate branches from the local branches these days). However, since you 
created the repository with an older git version, it still uses the 
original format (and even though you upgraded your git binary, it will use 
the old-fashioned branch format for remote branches and for 
configuration).

So in your case, the remote is probably described by the 
.git/remotes/origin file, and it looks something like

	URL: git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
	Pull: master:origin

and you should just change that "Pull:" line to have a "+" in front of the 
refspec:

	URL: git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
	Pull: +master:origin

which tells git that the remote "master" branch should now 
*unconditionally* be followed into the local "origin" branch when you 
pull.

(In a more modern setup, you wouldn't have a .git/remotes/origin file at 
all, insead you would have something like this in the .git/config file:

	[remote "origin"]
		url = git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
		fetch = +refs/heads/*:refs/remotes/origin/*

	[branch "master"]
		remote = origin
		merge = refs/heads/master

which means that there is a remote called "origin", and all of the remote 
heads in that remote ("refs/heads/*") will be fetched into the local 
repository under "refs/remotes/origin/*". And the "+" again means that we 
do this even if it's not a fast-forward, ie we trust the remote 
explicitly.

So "git fetch origin" will fetch *all* branches from "origin" into your 
local repository, but to distinguish them from your *own* branches, they 
will be under .git/refs/remotes/ instead of your "real" local branches 
that are in ".git/refs/heads/. So you can now see the difference between 
your *local* version of a branch X and the remote version of that same 
branch by using "X" and "remotes/origin/X" respectively to describe that 
branch.

Then, the second part of the above config file means that when you're on 
the local "master" branch and do a "git pull", it will fetch it from the 
remote "origin", and merge the remote "refs/heads/master" branch from that 
remote (the same one that will be fetched into refs/remotes/origin/master 
by a "git fetch".

Yeah, this is all a bit complex, and it takes a while to wrap your head 
around it, but I have to say, once you do, the git-1.5.x layout really 
*is* very powerful, and it's actually very natural too (but the "very 
natural" part only comes after you have that "Aaahh!" moment!)

			Linus

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30 18:48             ` Linus Torvalds
@ 2007-03-30 19:49               ` Guennadi Liakhovetski
  2007-03-30 20:06                 ` Linus Torvalds
                                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Guennadi Liakhovetski @ 2007-03-30 19:49 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: J. Bruce Fields, Junio C Hamano, git

On Fri, 30 Mar 2007, Linus Torvalds wrote:
> 
> You need to mark "refs/heads/origin" as always following the remote 
> "master", even if it gets re-based.  You do that by adding a "+" before 
> the refspec that describes the remote.
> 
> These days, with git-1.5.x, "git clone" will do that for you (and make the 
> remotes fall under "refs/remotes/origin/*" instead - they're considered 
> separate branches from the local branches these days). However, since you 
> created the repository with an older git version, it still uses the 
> original format (and even though you upgraded your git binary, it will use 
> the old-fashioned branch format for remote branches and for 
> configuration).
> 
> So in your case, the remote is probably described by the 
> .git/remotes/origin file, and it looks something like
> 
> 	URL: git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
> 	Pull: master:origin
> 
> and you should just change that "Pull:" line to have a "+" in front of the 
> refspec:
> 
> 	URL: git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
> 	Pull: +master:origin
> 
> which tells git that the remote "master" branch should now 
> *unconditionally* be followed into the local "origin" branch when you 
> pull.
> 
> (In a more modern setup, you wouldn't have a .git/remotes/origin file at 
> all, insead you would have something like this in the .git/config file:
> 
> 	[remote "origin"]
> 		url = git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
> 		fetch = +refs/heads/*:refs/remotes/origin/*
> 
> 	[branch "master"]
> 		remote = origin
> 		merge = refs/heads/master
> 
> which means that there is a remote called "origin", and all of the remote 
> heads in that remote ("refs/heads/*") will be fetched into the local 
> repository under "refs/remotes/origin/*". And the "+" again means that we 
> do this even if it's not a fast-forward, ie we trust the remote 
> explicitly.
> 
> So "git fetch origin" will fetch *all* branches from "origin" into your 
> local repository, but to distinguish them from your *own* branches, they 
> will be under .git/refs/remotes/ instead of your "real" local branches 
> that are in ".git/refs/heads/. So you can now see the difference between 
> your *local* version of a branch X and the remote version of that same 
> branch by using "X" and "remotes/origin/X" respectively to describe that 
> branch.
> 
> Then, the second part of the above config file means that when you're on 
> the local "master" branch and do a "git pull", it will fetch it from the 
> remote "origin", and merge the remote "refs/heads/master" branch from that 
> remote (the same one that will be fetched into refs/remotes/origin/master 
> by a "git fetch".
> 
> Yeah, this is all a bit complex, and it takes a while to wrap your head 
> around it, but I have to say, once you do, the git-1.5.x layout really 
> *is* very powerful, and it's actually very natural too (but the "very 
> natural" part only comes after you have that "Aaahh!" moment!)

Aha, so, that's how it is then! Why hasn't anybody explained this to me 
strait away?!:-))))

Yeah, hopefully, I'll learn to at least use this thing efficiently enough. 
Someone has to write a book on it though...

And, so, it's a pity I cloned Paul's tree yesterday with the "old" git. 
And from your answer above it seems like some features of the "new" git 
will not be available with this tree, like equally named local and remote 
branches, etc. There isn't a way to convert such a "old style" tree to the 
"new style", is there? Not a big deal, will re-clone at some point, maybe 
when we get local git mirrors...

Many thanks for taking your time to answer, Linus!
Guennadi
---
Guennadi Liakhovetski

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30 19:49               ` Guennadi Liakhovetski
@ 2007-03-30 20:06                 ` Linus Torvalds
  2007-03-30 20:23                 ` Theodore Tso
  2007-03-30 20:39                 ` Junio C Hamano
  2 siblings, 0 replies; 18+ messages in thread
From: Linus Torvalds @ 2007-03-30 20:06 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: J. Bruce Fields, Junio C Hamano, git



On Fri, 30 Mar 2007, Guennadi Liakhovetski wrote:
> 
> And, so, it's a pity I cloned Paul's tree yesterday with the "old" git. 
> And from your answer above it seems like some features of the "new" git 
> will not be available with this tree, like equally named local and remote 
> branches, etc. There isn't a way to convert such a "old style" tree to the 
> "new style", is there? Not a big deal, will re-clone at some point, maybe 
> when we get local git mirrors...

There's a conversion script to help you convert in place if you care.

Look at the git list for an email that looks something like this:

	Date: Wed, 14 Mar 2007 02:16:12 -0400
	From: Shawn O. Pearce <spearce@spearce.org>
	To: git@vger.kernel.org
	Subject: Upgrade to 1.5.0 utility

	Yesterday on #git DrNick wanted a script to update a pre-1.5.0
	Git repository to be like a 1.5.0 (and later) style repository.
	...

which has a script in it to do this (it uses another script that is 
already in git/contrib/ that just moves all the ".git/remotes" entries 
as-is from the remotes files into the .git/config file)

I haven't tested it myself, so caveat emptor. But the config file format 
really isn't *that* complicated - do the conversion with the script, and 
then just go back and look at .git/config and verify that it looks sane, 
or edit it to match your taste.

		Linus

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30 19:49               ` Guennadi Liakhovetski
  2007-03-30 20:06                 ` Linus Torvalds
@ 2007-03-30 20:23                 ` Theodore Tso
  2007-03-30 20:39                 ` Junio C Hamano
  2 siblings, 0 replies; 18+ messages in thread
From: Theodore Tso @ 2007-03-30 20:23 UTC (permalink / raw)
  To: Guennadi Liakhovetski
  Cc: Linus Torvalds, J. Bruce Fields, Junio C Hamano, git

On Fri, Mar 30, 2007 at 09:49:20PM +0200, Guennadi Liakhovetski wrote:
> Aha, so, that's how it is then! Why hasn't anybody explained this to me 
> strait away?!:-))))

A lot of this is in the git 1.5's User Manual:

	http://www.kernel.org/pub/software/scm/git/docs/user-manual.html

See also the man page for git-remote, or here:

	http://www.kernel.org/pub/software/scm/git/docs/git-remote.html


> Yeah, hopefully, I'll learn to at least use this thing efficiently enough. 
> Someone has to write a book on it though...

The user-manual and the git tutorials are pretty good --- just make
sure you look at the ones that come with git 1.5.0, or the ones at
http://www.kernel.org/pub/software/svm/git/docs (which reflects the
Documentation as of the latest development version of git).

The problem is that there are some tutorials on the web which assume
git 1.4.x, or cogito, and that has been listed as a defect by people
who have been confused because those tutorials are out of date with
respect to modern git.[1]

[1] http://changelog.complete.org/posts/594-More-on-Git,-Mercurial,-and-Bzr.html

> And, so, it's a pity I cloned Paul's tree yesterday with the "old" git. 
> And from your answer above it seems like some features of the "new" git 
> will not be available with this tree, like equally named local and remote 
> branches, etc. There isn't a way to convert such a "old style" tree to the 
> "new style", is there? Not a big deal, will re-clone at some point, maybe 
> when we get local git mirrors...

Yeah, we need to really make sure the word gets out that new git users
should really make sure they are using git 1.5, and not git 1.4.x; it
is such an improvement in terms of usability over git 1.4.x that there
really is no comparison.  (Of course, guess what Debian is going to
ship in their soon-to-be-release "stable" distribution?  git 1.4.4.  Sigh...)

It is possible to get the new style naming, by using the git remote
command.  Just do

	git remote add origin <url>

...and that will adjust your git configuration file appropriate.
Check out the git 1.5.0 release notes, and the git-config man page,
and there are some other adjustments you can make as well that will
make git more efficiently, at the cost of breaking some level of
compatibility with git 1.4.x tools which replicate via the "dumb" http
protocol.  But for local development repositories that generally isn't
a concern.

						- Ted

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30 19:49               ` Guennadi Liakhovetski
  2007-03-30 20:06                 ` Linus Torvalds
  2007-03-30 20:23                 ` Theodore Tso
@ 2007-03-30 20:39                 ` Junio C Hamano
  2007-03-30 21:11                   ` Guennadi Liakhovetski
  2 siblings, 1 reply; 18+ messages in thread
From: Junio C Hamano @ 2007-03-30 20:39 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: Linus Torvalds, J. Bruce Fields, git

Guennadi Liakhovetski <g.liakhovetski@gmx.de> writes:

>> Yeah, this is all a bit complex, and it takes a while to wrap your head 
>> around it, but I have to say, once you do, the git-1.5.x layout really 
>> *is* very powerful, and it's actually very natural too (but the "very 
>> natural" part only comes after you have that "Aaahh!" moment!)
>
> Aha, so, that's how it is then! Why hasn't anybody explained this to me 
> strait away?!:-))))

Because I and others have explained that to other people on the
list a few times already, perhaps?  The list archive is your
friend.

> .... There isn't a way to convert such a "old style" tree to the 
> "new style", is there?

That also can be found in the list archive.  I think Shawn
Pearce wrote that script using contrib/remotes2config.sh from
the git.git project source tree.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: basics... when reading docs doesn't help
  2007-03-30 20:39                 ` Junio C Hamano
@ 2007-03-30 21:11                   ` Guennadi Liakhovetski
  0 siblings, 0 replies; 18+ messages in thread
From: Guennadi Liakhovetski @ 2007-03-30 21:11 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Linus Torvalds, J. Bruce Fields, git

On Fri, 30 Mar 2007, Junio C Hamano wrote:

> Guennadi Liakhovetski <g.liakhovetski@gmx.de> writes:
> 
> >> Yeah, this is all a bit complex, and it takes a while to wrap your head 
> >> around it, but I have to say, once you do, the git-1.5.x layout really 
> >> *is* very powerful, and it's actually very natural too (but the "very 
> >> natural" part only comes after you have that "Aaahh!" moment!)
> >
> > Aha, so, that's how it is then! Why hasn't anybody explained this to me 
> > strait away?!:-))))
> 
> Because I and others have explained that to other people on the
> list a few times already, perhaps?  The list archive is your
> friend.

Emn, sorry, that was supposed to be a joke...

In my original post I said something like "I know, this most probably has 
been asked (many times) before, but since the questions are pretty 
generic, I don't have a very good idea what to search archives for, but 
any pointer to a thread in archive would be appreciated". I am greatful 
somebody took his time to explain a couple of things to me even knowing I 
will only understand a few percent strait away. And I am usually the first 
one to point others to list archives:-) It is easy to search for isp1761, 
but it is not so easy to search for "clone multiple trees reuse disk 
space..."

I am greatful for any help and I can well understand those who decided not 
to repeat what they've already explained a 100 times before.

> > .... There isn't a way to convert such a "old style" tree to the 
> > "new style", is there?
> 
> That also can be found in the list archive.  I think Shawn
> Pearce wrote that script using contrib/remotes2config.sh from
> the git.git project source tree.

Thanks, now this is easy to search!

Thanks
Guennadi
---
Guennadi Liakhovetski

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2007-03-30 21:19 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-29 20:50 basics... when reading docs doesn't help Guennadi Liakhovetski
2007-03-29 21:16 ` J. Bruce Fields
2007-03-29 21:26   ` Junio C Hamano
2007-03-29 21:46     ` J. Bruce Fields
2007-03-29 22:13       ` Guennadi Liakhovetski
2007-03-29 22:35         ` Linus Torvalds
2007-03-30 18:16           ` Guennadi Liakhovetski
2007-03-30 18:48             ` Linus Torvalds
2007-03-30 19:49               ` Guennadi Liakhovetski
2007-03-30 20:06                 ` Linus Torvalds
2007-03-30 20:23                 ` Theodore Tso
2007-03-30 20:39                 ` Junio C Hamano
2007-03-30 21:11                   ` Guennadi Liakhovetski
2007-03-30  2:43         ` Theodore Tso
2007-03-30 14:49           ` J. Bruce Fields
2007-03-30 18:02         ` Andreas Herrmann
2007-03-30 18:24           ` Guennadi Liakhovetski
2007-03-29 22:27   ` Matthieu Moy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).