git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* how to combine two clones in a collection
@ 2007-07-09 22:22 martin f krafft
  2007-07-10  2:35 ` Linus Torvalds
  0 siblings, 1 reply; 16+ messages in thread
From: martin f krafft @ 2007-07-09 22:22 UTC (permalink / raw)
  To: git discussion list

[-- Attachment #1: Type: text/plain, Size: 1531 bytes --]

Dear list,

I am new to git but already quite sold on it. Especially git-svn
makes my heart jump.

I am now ready to move to using git for most of my everyday work,
but I am still unsure how to tackle one specific aspect of it, for
which I used svn:externals in the past. I know about git
subprojects, but these aren't what I want, really.

I am a Debian developer, and while the upstream trunk is usually
maintained in SVN by upstream him/herself, I maintain the ./debian
directory elsewhere.

With SVN, I would have a directory with two external entries:

  upstream.trunk svn+ssh://svn.upstream.org/path/to/trunk
  upstream.trunk/debian svn+ssh://svn.debian.org/svn/pkg/trunk/debian

I hope this makes what I mean obvious. GNU arch has a similar
concept called configs.

How can I do this with git? I am aware that maybe the best way would
be to use git-svn to track the upstream branch remotely and to add
./debian in a separate git branch (and to stop using SVN and switch
to git for ./debian), but I am not sure I want to mirror all
upstream projects in git repos published on svn.debian.org, and if
it's only for space reasons.

Do you know of other approaches, short of writing my own
config-manager?

Thanks,

-- 
martin;              (greetings from the heart of the sun.)
  \____ echo mailto: !#^."<*>"|tr "<*> mailto:" net@madduck
 
spamtraps: madduck.bogus@madduck.net
 
"never eat more than you can lift."
                                                       -- miss piggy

[-- Attachment #2: Digital signature (GPG/PGP) --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

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

* Re: how to combine two clones in a collection
  2007-07-09 22:22 how to combine two clones in a collection martin f krafft
@ 2007-07-10  2:35 ` Linus Torvalds
  2007-07-10  6:21   ` martin f krafft
  0 siblings, 1 reply; 16+ messages in thread
From: Linus Torvalds @ 2007-07-10  2:35 UTC (permalink / raw)
  To: martin f krafft; +Cc: git discussion list



On Tue, 10 Jul 2007, martin f krafft wrote:
> 
> I am now ready to move to using git for most of my everyday work,
> but I am still unsure how to tackle one specific aspect of it, for
> which I used svn:externals in the past. I know about git
> subprojects, but these aren't what I want, really.

I really _think_ that what you want is to just use separate branches, if I 
understand correctly. That makes it really easy to just have both lines of 
development (both the "trunk" and your "debian" one) in one git 
repository.

Of course, especially if you want to continue to work the way you probably 
worked with SVN (ie you are used to seeing those two branches as two 
separate directories), that means that while you can (and should) see it 
as a single git project, you'd normally end up just having two copies of 
that project: they'd _both_ have two branches, but they'd just en dup 
having different branches checked out.

Of course, after you get comfy enough with the setup, you might end up 
just deciding that you might as well just switch branches around in a 
single repository (which is what a lot of git users end up doing), but at 
least initially, it's probably easier from a conceptual standpoint to just 
have the two branches checked out in separate copies of the repos.

> With SVN, I would have a directory with two external entries:
> 
>   upstream.trunk svn+ssh://svn.upstream.org/path/to/trunk
>   upstream.trunk/debian svn+ssh://svn.debian.org/svn/pkg/trunk/debian

So in git, you'd have just one "project" with two branches - perhaps just 
called "upstream" and "debian".

Of course, with git, that single "project" can then exist in a distributed 
manner in many different places, and having two copies with different 
branches checked out would just happen to be the one that most closely 
resembles your current situation.

> How can I do this with git? I am aware that maybe the best way would
> be to use git-svn to track the upstream branch remotely and to add
> ./debian in a separate git branch (and to stop using SVN and switch
> to git for ./debian)

I don't think you'd have to stop using SVN. Just continue to track the 
"upstream" branch with git-svn, and then you can merge in the upstream 
into your "debian" branch that also has all the debian-specific stuff.

(And no, I don't know what the standard debian package management setup 
looks like, but I would hope that your extra stuff would be just a few 
files and package descriptions, and obviously any of the local debian 
changes to the project).

		Linus

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

* Re: how to combine two clones in a collection
  2007-07-10  2:35 ` Linus Torvalds
@ 2007-07-10  6:21   ` martin f krafft
  2007-07-10  7:17     ` Junio C Hamano
                       ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: martin f krafft @ 2007-07-10  6:21 UTC (permalink / raw)
  To: git discussion list

[-- Attachment #1: Type: text/plain, Size: 3998 bytes --]

Thanks, Linus, for your time in answering my questions. I have some
more comments and questions in reply. I hope I am coherent enough,
this subject matter doesn't exactly flow off my tongue with ease
yet...

also sprach Linus Torvalds <torvalds@linux-foundation.org> [2007.07.10.0435 +0200]:
> I really _think_ that what you want is to just use separate
> branches, if I understand correctly. That makes it really easy to
> just have both lines of development (both the "trunk" and your
> "debian" one) in one git repository.

It does mean, however, that I duplicate the upstream into my repo,
and thus into the published repo at git.debian.org, because I cannot
just publish a single branch ('debian') in such a way that people
could clone it and still be able to build the package against
upstream (which they'd have to obtain for themselves), right?

> Of course, especially if you want to continue to work the way you
> probably worked with SVN (ie you are used to seeing those two
> branches as two separate directories), that means that while you
> can (and should) see it as a single git project, you'd normally
> end up just having two copies of that project: they'd _both_ have
> two branches, but they'd just en dup having different branches
> checked out.

The way I tend to think about a pair of branches is that one depends
on the other, or rather, one stems from the other. Thus, I'd
probably branch the 'debian' branch off 'upstream', and add the
./debian directory, and then either rebase the debian branch onto
new upstream heads, or merge upstream into the debian branch on new
versions.

This makes perfect sense and I have been experimenting with such
a workflow before:
http://albatross.madduck.net/pipermail/vcs-pkg/2007-June/000001.html

So if I made changes to the debian branch, I'd check it out first,
then return to the upstream branch when done.

Your suggestion to checkout the same repo twice with different
branches does sound a lot like the way I used to do things in SVN.
However, I guess what I am trying to prevent is having to manually
set up this hierarchy on each machine I choose to work on. Instead,
I'd rather be able to clone a repository and be ready to work.

In your scenario, would I make two branches and then import upstream
into one, the ./debian directory into the other, and never ever
merge back and forth again, thus treating them as separate
directories?

> Of course, after you get comfy enough with the setup, you might
> end up just deciding that you might as well just switch branches
> around in a single repository (which is what a lot of git users
> end up doing), but at least initially, it's probably easier from
> a conceptual standpoint to just have the two branches checked out
> in separate copies of the repos.

Okay, this is beginning to make sense. However, the debian branch
tracks changes mostly to ./debian/*. To check it out separately,
I need a directory. If usptream is checked out to ., then if I'd
check out the debian branch do ./debian, I'd end up with
./debian/debian. Do you suggest the use of a symlink then?

> > How can I do this with git? I am aware that maybe the best way
> > would be to use git-svn to track the upstream branch remotely
> > and to add ./debian in a separate git branch (and to stop using
> > SVN and switch to git for ./debian)
> 
> I don't think you'd have to stop using SVN.

I think I would want to. :)

> (And no, I don't know what the standard debian package management
> setup looks like, but I would hope that your extra stuff would be
> just a few files and package descriptions, and obviously any of
> the local debian changes to the project).

Your hopes seem to be quite close to reality. :)

Thanks,

-- 
martin;              (greetings from the heart of the sun.)
  \____ echo mailto: !#^."<*>"|tr "<*> mailto:" net@madduck
 
spamtraps: madduck.bogus@madduck.net
 
http://www.vcnet.com/bms/

[-- Attachment #2: Digital signature (GPG/PGP) --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

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

* Re: how to combine two clones in a collection
  2007-07-10  6:21   ` martin f krafft
@ 2007-07-10  7:17     ` Junio C Hamano
  2007-07-10  7:40       ` martin f krafft
  2007-07-10  7:51     ` Martin Langhoff
  2007-07-10 17:05     ` Linus Torvalds
  2 siblings, 1 reply; 16+ messages in thread
From: Junio C Hamano @ 2007-07-10  7:17 UTC (permalink / raw)
  To: martin f krafft; +Cc: git

martin f krafft <madduck@madduck.net> writes:

> Thanks, Linus, for your time in answering my questions. I have some
> more comments and questions in reply. I hope I am coherent enough,
> this subject matter doesn't exactly flow off my tongue with ease
> yet...
>
> also sprach Linus Torvalds <torvalds@linux-foundation.org> [2007.07.10.0435 +0200]:
>> I really _think_ that what you want is to just use separate
>> branches, if I understand correctly. That makes it really easy to
>> just have both lines of development (both the "trunk" and your
>> "debian" one) in one git repository.
>
> It does mean, however, that I duplicate the upstream into my repo,
> and thus into the published repo at git.debian.org, because I cannot
> just publish a single branch ('debian') in such a way that people
> could clone it and still be able to build the package against
> upstream (which they'd have to obtain for themselves), right?

I've seen two kinds of debianized source tree.  One kind has
changes already applied to the pristine source outside debian/
subdirectory, and debian/rules does the debian specific
customized build, install and packaging.  The other kind does
not have _any_ change to the pristine except it has debian/
subdirectory and the first thing debian/rules does is to apply
patches to pristine from patch files kept in debian/
subdirectory.  The answer largely depends on which arrangement
you have in mind for your package.

For the former kind, It is unavoidable for people to get your
(slightly modified) upstream source from you --- there is
nowhere else that stores what you changed.  Extracting the
vanilla pristine and debian/ separately would not cut it.  For
such an arrangement, "upstream" (or "pristine") branch would
contain everything you get from your upstream tarball (or SVN)
without any of Debianization changes (you can still have generic
"fixes and enhancements" of your own there to be fed upstream).
Your "master" (you could call it "debianization") branch will
fork off of that branch, and the first commit on that branch
would add debian/ subdirectory.  All the debianization
modification to the upstream, if needed, also go to this branch.
Your users will clone and pull from your "master" and do
"fakeroot debian/rules binary" or whatever, and all is good.

For the latter, since the changes from upstream is isolated to
your additional debian/ subdirectory, you could arrange your
repository like this, even without using the subproject support:

	.git/
        .gitignore (perhaps untracked)
        Makefile (upstream)
        foo.c (upstream)
        ...
        debian/.git
        debian/rules (yours)
        debian/control (yours)
        ...

Then, have the top-level .git/ repository control pristine
upstream sources from SVN (you may want to add .gitignore to
ignore debian/ subdirectory).  In debian/, you create another
independent repository, and maintain _ONLY_ debianization.  You
could even publish only that repository to your users without
publishing the upstream sources, if they know which version of
upstream source to use.

I tend to prefer the former, from the end user's point of view.

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

* Re: how to combine two clones in a collection
  2007-07-10  7:17     ` Junio C Hamano
@ 2007-07-10  7:40       ` martin f krafft
  0 siblings, 0 replies; 16+ messages in thread
From: martin f krafft @ 2007-07-10  7:40 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 1472 bytes --]

also sprach Junio C Hamano <gitster@pobox.com> [2007.07.10.0917 +0200]:
> For the former kind, It is unavoidable for people to get your
> (slightly modified) upstream source from you --- there is
> nowhere else that stores what you changed.

This is pretty similar to a method developed by Manoj Srivastava adn
described here: http://arch.debian.org/arch/private/srivasta/ and
it's very promising, albeit a little complex for newcomers, in my
experience. As linked previously, I presented a similar workflow
with git[0] at DebConf7[1].

0. http://albatross.madduck.net/pipermail/vcs-pkg/2007-June/000001.html
1. https://penta.debconf.org/~joerg/events/53.en.html

I actually knew the answers to my questions, I guess, but I was way
too confused to get the picture straight. Thanks to both of you for
your time in helping me understand.

I shall spend some time experimenting and will then blog about my
experience of converting the various types of Debian source packages
to the suggested style of maintenance. I shall post the URL to this
thread too.

-- 
martin;              (greetings from the heart of the sun.)
  \____ echo mailto: !#^."<*>"|tr "<*> mailto:" net@madduck
 
spamtraps: madduck.bogus@madduck.net
 
"for art to exist, for any sort of aesthetic activity or perception to
 exist, a certain physiological precondition is indispensable:
 intoxication."
                                                -- friedrich nietzsche

[-- Attachment #2: Digital signature (GPG/PGP) --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

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

* Re: how to combine two clones in a collection
  2007-07-10  6:21   ` martin f krafft
  2007-07-10  7:17     ` Junio C Hamano
@ 2007-07-10  7:51     ` Martin Langhoff
  2007-07-10 17:05     ` Linus Torvalds
  2 siblings, 0 replies; 16+ messages in thread
From: Martin Langhoff @ 2007-07-10  7:51 UTC (permalink / raw)
  To: git discussion list

On 7/10/07, martin f krafft <madduck@madduck.net> wrote:
> It does mean, however, that I duplicate the upstream into my repo,
> and thus into the published repo at git.debian.org, because I cannot
> just publish a single branch ('debian') in such a way that people
> could clone it and still be able to build the package against
> upstream (which they'd have to obtain for themselves), right?

Yes. But is that a problem? In most cases, the complete history of the
project is fairly small if your repo is well packed. Often not much
bigger than a tarball of one source snapshot.

What does the following say?

   git repack -a -d
   du -sh .git/objects/pack

cheers,


martni

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

* Re: how to combine two clones in a collection
  2007-07-10  6:21   ` martin f krafft
  2007-07-10  7:17     ` Junio C Hamano
  2007-07-10  7:51     ` Martin Langhoff
@ 2007-07-10 17:05     ` Linus Torvalds
  2007-07-10 17:45       ` martin f krafft
  2 siblings, 1 reply; 16+ messages in thread
From: Linus Torvalds @ 2007-07-10 17:05 UTC (permalink / raw)
  To: martin f krafft; +Cc: git discussion list



On Tue, 10 Jul 2007, martin f krafft wrote:
> 
> also sprach Linus Torvalds <torvalds@linux-foundation.org> [2007.07.10.0435 +0200]:
> > I really _think_ that what you want is to just use separate
> > branches, if I understand correctly. That makes it really easy to
> > just have both lines of development (both the "trunk" and your
> > "debian" one) in one git repository.
> 
> It does mean, however, that I duplicate the upstream into my repo,
> and thus into the published repo at git.debian.org, because I cannot
> just publish a single branch ('debian') in such a way that people
> could clone it and still be able to build the package against
> upstream (which they'd have to obtain for themselves), right?

Well, I think you have two cases:

 - the git users

   These would get both branches (including all of the upstream, of 
   course), but that's ok, since git will share all the common objects 
   *anyway*, so there is no "duplication". You can have a hundred 
   branches, and they won't use one whit more memory of bandwidth (apart 
   from the branch refs themselves being sent over, of course), and only 
   the actual *differences* between branches will take up space.

 - the non-git users

   Here, I don't really know how the debian package management is supposed 
   to work, but since they obviously aren't using git, they must be using 
   something else. A tar-ball or just a series of patches? Both would be 
   trivial to implement as just an "export" from your git tree. Or you'd 
   export the "debian" branch as a separate SVN repo (I've not used the 
   "export back into a SVN" thing, so I don't know how well that works).

In particular, if all your "debian-specific" stuff is almost all in the 
"debian" subdirectory, then you can trivially make a tar-file by just 
using

	git archive --prefix=upstream- HEAD debian > upstream-debian.tar

and git will literally generate the tar-file of that directory for you.

> The way I tend to think about a pair of branches is that one depends
> on the other, or rather, one stems from the other.

.. and no, that's not really how git works from a technical angle: in the 
the git model, all branches are technically 100% equal, and no branch 
"depends" on anything else, they are all equally first-class citizens.

But while *technically* all branches are equal in git, at the same time 
there's no reason not to _think_ of branches as having a hierarchy if you 
want to. In particular:

 - it's how people tend to use git anyway (ie the "origin" branch is 
   what you're tracking, and you have your own changes in your local 
   branches)

 - and git will never duplicate information for branches that have a 
   common history or contents anyway. So while git branches are totally 
   "independent" in the technical sense, the data structures are all 
   designed so that they will share everything that they can possibly 
   share (in fact, thanks to the "delta-against-anything" model, different 
   branches will share much more than in something like CVS/SVN)

> So if I made changes to the debian branch, I'd check it out first,
> then return to the upstream branch when done.

It sounds like you would actually be fairly comfy with the git "switch 
branches within one repository" model, and you might not even need to make 
it look like two different trees.

> Okay, this is beginning to make sense. However, the debian branch
> tracks changes mostly to ./debian/*. To check it out separately,
> I need a directory. If usptream is checked out to ., then if I'd
> check out the debian branch do ./debian, I'd end up with
> ./debian/debian. Do you suggest the use of a symlink then?

No, I'm suggesting that you have the upstream thing checked out in ".", 
and you have the "debian" branch IN THE SAME PLACE. So when you do

	git checkout debian

it will just check out all the debian stuff in the same directory, so now 
you'll get a ./debian/ directory with all your debian stuff.

When you do

	git checkout upstream

the files in that directory just go away, because it doesn't exist in 
the "upstream" branch

But I don't want to fool you - I do think you'll have to change *some* of 
how you work. But it sounds like your workflow is *fairly* close to a very 
natural git flow.

		Linus

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

* Re: how to combine two clones in a collection
  2007-07-10 17:05     ` Linus Torvalds
@ 2007-07-10 17:45       ` martin f krafft
  2007-07-10 18:27         ` Brian Gernhardt
  2007-07-11 10:46         ` Jakub Narebski
  0 siblings, 2 replies; 16+ messages in thread
From: martin f krafft @ 2007-07-10 17:45 UTC (permalink / raw)
  To: git discussion list

[-- Attachment #1: Type: text/plain, Size: 4097 bytes --]

also sprach Linus Torvalds <torvalds@linux-foundation.org> [2007.07.10.1905 +0200]:
>    These would get both branches (including all of the upstream,
>    of course), but that's ok, since git will share all the common
>    objects *anyway*, so there is no "duplication". You can have
>    a hundred branches, and they won't use one whit more memory of
>    bandwidth (apart from the branch refs themselves being sent
>    over, of course), and only the actual *differences* between
>    branches will take up space.

The duplication I meant was when upstream uses SVN or a tarball,
which I then have to track/import into my git repo. But it's just
space and that's cheap these days.

>    Here, I don't really know how the debian package management is
>    supposed to work, but since they obviously aren't using git,
>    they must be using something else. A tar-ball or just a series
>    of patches? Both would be trivial to implement as just an
>    "export" from your git tree. Or you'd export the "debian"
>    branch as a separate SVN repo (I've not used the "export back
>    into a SVN" thing, so I don't know how well that works).

Just in case you're interested, otherwise the following two
paragraphs can be safely skipped:

  There is no standard for Debian packaging. In general, it's the
  upstream tarball and a diff to be applied for debianisation. Some
  people just use one giant diff, others use the diff to add patches
  as separate files to the unpacked contents of the tarball, which
  are then applied.

  I guess my final goal is to use git and branches, one to track
  upstream, one for every feature/patch I add, and then to create
  a source package from that by packaging the upstream branch into
  a tarball (or reusing an existing one), turning each branch into
  a single-file patch and then create the overall diff to add these
  single-files, including some glue to apply them automatically on
  unpacking/building.

> > The way I tend to think about a pair of branches is that one
> > depends on the other, or rather, one stems from the other.
> 
> .. and no, that's not really how git works from a technical angle:
> in the the git model, all branches are technically 100% equal, and
> no branch "depends" on anything else, they are all equally
> first-class citizens.

Right, I knew that. What I meant is more that a branch derives off
another, meaning that before and including the branching commit,
they have shared ancestry.

I wonder how to create a project with two completely independent
branches which have no common ancestry. I don't think it's possible.
One needs a throwaway branch to create the first commit, then branch
each of the two branches off that, then delete the throwaya branch
(or keep it around).

But this is getting academic now...

> > So if I made changes to the debian branch, I'd check it out
> > first, then return to the upstream branch when done.
> 
> It sounds like you would actually be fairly comfy with the git
> "switch branches within one repository" model, and you might not
> even need to make it look like two different trees.

Definitely.

As a Debian maintainer who really wants to use git for Debian
packaging though, I also need to worry about all the other people
who obtain my source package and need to be comfortable with it.
I may well understand what my 123 branches are for and how they are
interlinked, but that doesn't help Jane Schmoo fixing
a release-critical bug while I'm backpacking in Southeast Asia.

> But I don't want to fool you - I do think you'll have to change
> *some* of how you work. But it sounds like your workflow is
> *fairly* close to a very natural git flow.

Thanks for the encouragement!

-- 
martin;              (greetings from the heart of the sun.)
  \____ echo mailto: !#^."<*>"|tr "<*> mailto:" net@madduck
 
spamtraps: madduck.bogus@madduck.net
 
it is better to have loft and lost
than to never have loft at all.
                                                       -- groucho marx

[-- Attachment #2: Digital signature (GPG/PGP) --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

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

* Re: how to combine two clones in a collection
  2007-07-10 17:45       ` martin f krafft
@ 2007-07-10 18:27         ` Brian Gernhardt
  2007-07-10 19:27           ` Kalle Pokki
  2007-07-11 10:46         ` Jakub Narebski
  1 sibling, 1 reply; 16+ messages in thread
From: Brian Gernhardt @ 2007-07-10 18:27 UTC (permalink / raw)
  To: martin f krafft; +Cc: git discussion list


On Jul 10, 2007, at 1:45 PM, martin f krafft wrote:
> I wonder how to create a project with two completely independent
> branches which have no common ancestry. I don't think it's possible.
> One needs a throwaway branch to create the first commit, then branch
> each of the two branches off that, then delete the throwaya branch
> (or keep it around).
>
> But this is getting academic now...

But interesting.

What you describe won't create two independent branches.  They'll  
share the root commit.  I think what you have do is create the first  
branch as normal, then clear out the working copy (be sure not to  
delete .git) and do the commit manually.  I believe it goes something  
like this:

   git init
   # Create files for master
   git add .
   git commit
   rm -rf * .git/index
   # Create files for second branch
   git add .
   tree=$(git write-tree)
   # Edit commit message into some file (commit-msg here)
   commit=$(git commit-tree $tree < commit-msg)
   git update-ref refs/branches/independent $commit

The important bits are to be sure to remove the index so you don't  
commit the wrong files and the last four lines that do the heavy  
lifting.  You could also create the branch in a second repository and  
pull it from there into the first (probably simpler), or perhaps  
trick git-commit into thinking there isn't any commits yet (remove  
the index and HEAD perhaps?).

~~ Brian

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

* Re: how to combine two clones in a collection
  2007-07-10 18:27         ` Brian Gernhardt
@ 2007-07-10 19:27           ` Kalle Pokki
  2007-07-10 20:00             ` Brian Gernhardt
  0 siblings, 1 reply; 16+ messages in thread
From: Kalle Pokki @ 2007-07-10 19:27 UTC (permalink / raw)
  To: git

Brian Gernhardt <benji@silverinsanity.com> writes:

> What you describe won't create two independent branches.  They'll
> share the root commit.  I think what you have do is create the first
> branch as normal, then clear out the working copy (be sure not to
> delete .git) and do the commit manually.  I believe it goes something
> like this:

You can also just create two different git repositories and start making
the commits in the master (or any other) branch. Then combine the
repositories by fetching

        cd repo1
        git fetch ../repo2 master:repo2

This way the branches don't share anything, do they?

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

* Re: how to combine two clones in a collection
  2007-07-10 19:27           ` Kalle Pokki
@ 2007-07-10 20:00             ` Brian Gernhardt
  2007-07-10 23:45               ` Robin Rosenberg
  0 siblings, 1 reply; 16+ messages in thread
From: Brian Gernhardt @ 2007-07-10 20:00 UTC (permalink / raw)
  To: Kalle Pokki; +Cc: git


On Jul 10, 2007, at 3:27 PM, Kalle Pokki wrote:

> You can also just create two different git repositories and start  
> making
> the commits in the master (or any other) branch. Then combine the
> repositories by fetching
>
>         cd repo1
>         git fetch ../repo2 master:repo2
>
> This way the branches don't share anything, do they?

Yes, that's what I was referring to at the end when I wrote:

> You could also create the branch in a second repository and pull it  
> from there into the first (probably simpler),

But it seemed too simple.  ;-)  And that is exactly how I'd do it...   
Assuming I thought of it before using write-tree, commit-tree, and  
update-ref.  (Which is what happened.  I thought of the complicated  
method and wrote it up before thinking "duh, just use a second repo.")

~~ Brian

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

* Re: how to combine two clones in a collection
  2007-07-10 20:00             ` Brian Gernhardt
@ 2007-07-10 23:45               ` Robin Rosenberg
  2007-07-11 18:13                 ` martin f krafft
  0 siblings, 1 reply; 16+ messages in thread
From: Robin Rosenberg @ 2007-07-10 23:45 UTC (permalink / raw)
  To: Brian Gernhardt; +Cc: Kalle Pokki, git

tisdag 10 juli 2007 skrev Brian Gernhardt:
> 
> On Jul 10, 2007, at 3:27 PM, Kalle Pokki wrote:
> 
> > You can also just create two different git repositories and start  
> > making
> > the commits in the master (or any other) branch. Then combine the
> > repositories by fetching
> >
> >         cd repo1
> >         git fetch ../repo2 master:repo2
> >
> > This way the branches don't share anything, do they?
> 
> Yes, that's what I was referring to at the end when I wrote:
> 
> > You could also create the branch in a second repository and pull it  
> > from there into the first (probably simpler),
> 
> But it seemed too simple.  ;-)  And that is exactly how I'd do it...   
> Assuming I thought of it before using write-tree, commit-tree, and  
> update-ref.  (Which is what happened.  I thought of the complicated  
> method and wrote it up before thinking "duh, just use a second repo.")

And the simplest way to create an new indpendent branch:

echo ref: refs/heads/newbranch >.git/HEAD
Then prepare the content and commit like you used to do.

-- robin

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

* Re: how to combine two clones in a collection
  2007-07-10 17:45       ` martin f krafft
  2007-07-10 18:27         ` Brian Gernhardt
@ 2007-07-11 10:46         ` Jakub Narebski
  1 sibling, 0 replies; 16+ messages in thread
From: Jakub Narebski @ 2007-07-11 10:46 UTC (permalink / raw)
  To: git

martin f krafft wrote:

> I wonder how to create a project with two completely independent
> branches which have no common ancestry. I don't think it's possible.
> One needs a throwaway branch to create the first commit, then branch
> each of the two branches off that, then delete the throwaya branch
> (or keep it around).

Git repository itself  has a few completely independent branches, some of
them visible. One of them, the 'todo' branch is actually from independent
repository, two other, 'man' and 'html' are generated automatically by the
build script.

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

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

* Re: how to combine two clones in a collection
  2007-07-10 23:45               ` Robin Rosenberg
@ 2007-07-11 18:13                 ` martin f krafft
  2007-07-11 18:37                   ` Johannes Schindelin
  0 siblings, 1 reply; 16+ messages in thread
From: martin f krafft @ 2007-07-11 18:13 UTC (permalink / raw)
  To: git discussion list

[-- Attachment #1: Type: text/plain, Size: 1695 bytes --]

also sprach robin:
> And the simplest way to create an new indpendent branch:

> echo ref: refs/heads/newbranch >.git/HEAD
> Then prepare the content and commit like you used to do.

Hi Robin, thanks for this nice suggestion, which doesn't only
createa a new, independent branch, it also teaches me yet a bit
more about git.

I am a little uneasy about touching files in .git with non-git
tools, but everyone seems to be doing it, so I guess it's okay, and
it make git a lot more powerful too.

Anyway, I tried your method and there is one small problem:

  piper:~> git init-db
  Initialized empty Git repository in .git/
  piper:~> date > date; git add date; git commit -m.
  Created initial commit 2dd8d6f: .
  1 files changed, 1 insertions(+), 0 deletions(-)
  create mode 100644 date
  piper:~> echo ref: refs/heads/newbranch >| .git/HEAD
  piper:~> git status
  # On branch newbranch
  #
  # Initial commit
  #
  # Changes to be committed:
  #   (use "git rm --cached <file>..." to unstage)
  #
  #       new file: date
  #

If I were to run commit now, the file 'date' would become part of
the first commit to newbranch. But it's already in the master
branch.

Is there anyway I can prevent this and start a new branch from
scratch without having to unstage all previous additions?

Thanks,

-- 
martin;              (greetings from the heart of the sun.)
  \____ echo mailto: !#^."<*>"|tr "<*> mailto:" net@madduck
 
spamtraps: madduck.bogus@madduck.net
 
"anyone who is capable of getting themselves made president
 should on no account be allowed to do the job"
                                                      -- douglas adams

[-- Attachment #2: Digital signature (GPG/PGP) --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

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

* Re: how to combine two clones in a collection
  2007-07-11 18:13                 ` martin f krafft
@ 2007-07-11 18:37                   ` Johannes Schindelin
  2007-07-11 19:22                     ` martin f krafft
  0 siblings, 1 reply; 16+ messages in thread
From: Johannes Schindelin @ 2007-07-11 18:37 UTC (permalink / raw)
  To: martin f krafft; +Cc: git discussion list

Hi,

On Wed, 11 Jul 2007, martin f krafft wrote:

> also sprach robin:
> > And the simplest way to create an new indpendent branch:
> 
> > echo ref: refs/heads/newbranch >.git/HEAD
> > Then prepare the content and commit like you used to do.
> 
> I am a little uneasy about touching files in .git with non-git
> tools, but everyone seems to be doing it, so I guess it's okay, and
> it make git a lot more powerful too.

You can achieve the same with

	git symbolic-ref HEAD refs/heads/newbranch

There.  No editing in .git/.

>   piper:~> echo ref: refs/heads/newbranch >| .git/HEAD
>   piper:~> git status
>   # On branch newbranch
>   #
>   # Initial commit
>   #
>   # Changes to be committed:
>   #   (use "git rm --cached <file>..." to unstage)
>   #
>   #       new file: date
>   #

However, this is much easier without Git commands:

	rm .git/index

Of course, you can remove all files one by one, but that is certainly not 
easier:

	git ls-files --cached -z | xargs -0 git rm --cached

But then, you really can learn from both examples: .git/index contains 
references to the objects which are staged (in Git speak: "in the index").  
Git plays nicely when that file is missing, and assumes the index to be 
empty.

With "git ls-files --cached", you can list the files which are in the 
index, and with "git rm --cached", you remove the file _only_ from the 
index, but keep it in the working tree (if it is there).  The options "-z" 
and "-0" are only to separate the names by NUL instead of newlines, to 
allow funny file names, too.

If a few more people ask for that feature, we could enhance the semantics 
of "git branch" and "git checkout" to interpret the empty string 
similar to "git push <repo> :<name>".

Ciao,
Dscho

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

* Re: how to combine two clones in a collection
  2007-07-11 18:37                   ` Johannes Schindelin
@ 2007-07-11 19:22                     ` martin f krafft
  0 siblings, 0 replies; 16+ messages in thread
From: martin f krafft @ 2007-07-11 19:22 UTC (permalink / raw)
  To: git discussion list

[-- Attachment #1: Type: text/plain, Size: 3156 bytes --]

Thanks, Johannes, for this explanation. I actually had to prod him
on IRC a bit more until I understood, but the result is now
available on my blog:

  http://blog.madduck.net/vcs/2007.07.11_creating-a-git-branch-without-ancestry

  [...]
  Update: Johannes Schindelin taught me how to do the same without
  touching files in .git/:

  $ git symbolic-ref HEAD refs/heads/newbranch
  [...]

  and also addressed the issue which would have all files already
  committed to the "master" branch now appear in the git status
  output as staged.

  This is because the index contains the full copy of a revision of
  a file, as it would be if committed at any point. git status shows
  the differences between what has been committed, what would be
  committed, and what is available in the working tree. Since we
  pointed HEAD to nowhere ("newbranch" does not yet exist), the
  index and what has been committed (nothing in this case) diverge,
  the files are still staged, and thus are scheduled to be part of
  the impending commit.

  The way to fix this is to remove the index:

    $ rm .git/index

  This may seem weird, but it works, because git recreates the index
  whenever you switch branches:

    piper:~> git init-db
    Initialized empty Git repository in .git/
    piper:~> echo 1 > a; git add a; git commit -m.
    Created initial commit e774324: .
    1 files changed, 1 insertions(+), 0 deletions(-)
    create mode 100644 a
    piper:~> git symbolic-ref HEAD refs/heads/newbranch
    piper:~> rm .git/index
    piper:~> git status
    # On branch newbranch
    #
    # Initial commit
    #
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #       a
    nothing added to commit but untracked files present (use "git add" to track)
    piper:~> echo 2 > b; git add b; git commit -m.
    Created initial commit 54ff342: .
    1 files changed, 1 insertions(+), 0 deletions(-)
    create mode 100644 b
    piper:~> git branch
      master
    * newbranch
    piper:~> git checkout master
    fatal: Untracked working tree file 'a' would be overwritten by merge.
    piper:~> git checkout -f master

    Switched to branch "master"
    piper:~> git status
    # On branch master
    nothing to commit (working directory clean)
    piper:~> ls
    a
    piper:~> git checkout newbranch
    Switched to branch "newbranch"
    piper:~> git status
    # On branch newbranch
    nothing to commit (working directory clean)
    piper:~> ls
    b

  As you can see, the creation of the branch is a bit complex, but
  once you (forcefully) switched back to master, you can then
  freely switch between and commit to them.

-- 
martin;              (greetings from the heart of the sun.)
  \____ echo mailto: !#^."<*>"|tr "<*> mailto:" net@madduck
 
spamtraps: madduck.bogus@madduck.net
 
"when women love us, they forgive us everything, even our crimes;
 when they do not love us, they give us credit for nothing,
 not even our virtues."
                                                   -- honoré de balzac

[-- Attachment #2: Digital signature (GPG/PGP) --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

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

end of thread, other threads:[~2007-07-11 19:23 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-09 22:22 how to combine two clones in a collection martin f krafft
2007-07-10  2:35 ` Linus Torvalds
2007-07-10  6:21   ` martin f krafft
2007-07-10  7:17     ` Junio C Hamano
2007-07-10  7:40       ` martin f krafft
2007-07-10  7:51     ` Martin Langhoff
2007-07-10 17:05     ` Linus Torvalds
2007-07-10 17:45       ` martin f krafft
2007-07-10 18:27         ` Brian Gernhardt
2007-07-10 19:27           ` Kalle Pokki
2007-07-10 20:00             ` Brian Gernhardt
2007-07-10 23:45               ` Robin Rosenberg
2007-07-11 18:13                 ` martin f krafft
2007-07-11 18:37                   ` Johannes Schindelin
2007-07-11 19:22                     ` martin f krafft
2007-07-11 10:46         ` Jakub Narebski

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).