From: Andy Parkins <andyparkins@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <junkio@cox.net>
Subject: Re: [3/4] What's not in 1.5.2 (new topics)
Date: Thu, 17 May 2007 05:39:10 +0100 [thread overview]
Message-ID: <200705170539.11402.andyparkins@gmail.com> (raw)
In-Reply-To: <11793556371774-git-send-email-junkio@cox.net>
On Wednesday 2007, May 16, Junio C Hamano wrote:
> (3) git-checkout finds there is .gitmodules file in the
> tree (and the checked-out working file), which
> describes these subprojects. It looks at the config
> and notices that it does not yet know about them
> (obviously this is true, as this is the first checkout
> after clone, but I am trying to outline how checkout
> after a merge should work in the general case).
>
> It determines where to fetch that subproject from,
> perhaps it uses the default URL described in
> .gitmodules file to, while asking the user for
> confirmation and giving the user a chance to override
> it. And it records something in the config -- now that
> project is known to this repository.
I've been thinking about this .gitmodules thing and have a concern.
Aren't we falling into the svn:externals trap?
The svn:externals property is analagous to our .gitmodules file. svn
properties were basically just version controlled out-of-tree meta data
(making them annoying to work with - in-tree is better).
svn "submodule" support was done by writing something like
subproject svn://host/blah/blah
In the svn:externals property attached to the directory that
the "subproject" directory was in. To translate:
svn propset svn:externals "subproject svn://blah/blah/blah" .
git clone git://blah/blah/blah subproject
git add subproject
The hole that this sort of thing gets you in to is that the
svn:externals property is version controlled. Time passes since you
added the external; in that time the URL becomes invalid. No problem,
you simply change the svn:externals property. KABOOM. Now any
historical checkout fails because it checks out the svn:externals
property from that checkout and tries to use the wrong URL.
Our in-tree .gitmodules will have the same problem. I recognise that
you've mitigated that with some "confirm with the user, store in the
config" hand waving; but that is just hiding the problem: the submodule
URL is not something that should be version controlled; it is an
all-of-history property; when it changes for revision N it changes for
revision N-1, N-2, N-3, etc. Storing it in .gitmodules implies that
it's value in the past has meaning - it doesn't.
You mentioned yourself that that problem is not confined to the temporal
accuracy of .gitmodules, there is spatial accuracy too - there is no
guarantee that user A wants to use the same submodule URL as user B.
Fast forward to when we've got submodule support; let's say you start
using it for git-gui (for example). Somehow (let's leave the "how"
till later) I've gotten a working git tree with a git-gui checked out.
I go to my laptop and clone that repository (note: NOT the upstream
repository). When git-clone hits the git-gui submodule it should not
go looking for the upstream git-gui, I will want it to clone my local
git-gui submodule. i.e. in-tree .gitmodules URL for git-gui will be
wrong.
I hope the above shows that in-tree .gitmodules is wrong; it can only
ever be a hint, and in a great number of cases it will be an incorrect
hint.
I know it's so enticing to store it in-tree; it would be great because
the normal repository object transfer mechanism would get the URL of
the submodule to the receiver with no changes to current
infrastructure. I say: tough luck - we need another mechanism. The
submodule URL is a per-repository setting, not a per-project setting.
When fetching, some out-of-band mechanism for telling the other side
what URL _this_ repository thinks the submodule is at needs to be
supplied. I don't know what space there is in the git protocol for
putting that information, but I suspect that that is where it needs to
go.
As an alternative to that, the supermodule could be given the ability to
proxy for the submodule during clone. It knows where the submodule is
stored from it's point of view; is there scope for doing a
virtual-server-like system were the supermodule git-daemon just changes
to the submodule repository (in the case it is local) and thereby gives
the downstream git access to the submodule without it even needing a
URL.
> * Perhaps add 'tree' entries in the index. This may make the
> current cache-tree extension unnecessary, and I suspect it
> will simplify various paths that deal with D/F conflicts in
> the current codebase.
>
> I suspect this might need 1.6, as it is a one-way backward
> incompatible change for the 'index', but 'index' is local so
> it might not be such a big deal. In the worst case, when the
> users find "git checkout" from 1.5.2 does not work in a
> repository checked out with such an updated index format, we
> could ask them to "rm -f .git/index && git checkout HEAD".
I don't think even that would be necessary. Assuming that the new index
format is a superset of the old index format the only way that tree
entries would get in the index would be by using git-1.6. Almost by
definition then, if they are in there your git is up-to-date enough to
use them. (modulo me not really understanding what you mean)
Andy
--
Dr Andy Parkins, M Eng (hons), MIET
andyparkins@gmail.com
next prev parent reply other threads:[~2007-05-17 4:39 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-16 22:47 [0/4] What's not in 1.5.2 (overview) Junio C Hamano
2007-05-16 22:47 ` [1/4] What's not in 1.5.2 (have been cooking in next) Junio C Hamano
2007-05-16 22:47 ` [2/4] What's not in 1.5.2 (will cook " Junio C Hamano
2007-05-16 22:47 ` [3/4] What's not in 1.5.2 (new topics) Junio C Hamano
2007-05-17 4:39 ` Andy Parkins [this message]
2007-05-17 5:21 ` Junio C Hamano
2007-05-17 7:51 ` Andy Parkins
2007-05-17 11:02 ` Alex Riesen
2007-05-17 12:46 ` Petr Baudis
2007-05-17 13:46 ` Jeff King
2007-05-17 16:10 ` Petr Baudis
2007-05-17 16:25 ` Jeff King
2007-05-17 17:30 ` Petr Baudis
2007-05-17 17:35 ` Jeff King
2007-05-17 18:49 ` Junio C Hamano
2007-05-18 12:58 ` Jeff King
2007-05-17 18:47 ` Junio C Hamano
2007-05-17 13:45 ` Nicolas Pitre
2007-05-17 21:58 ` Michael S. Tsirkin
2007-05-17 23:41 ` Josef Weidendorfer
2007-05-18 0:32 ` Steven Grimm
2007-05-18 4:50 ` Petr Baudis
2007-05-18 9:18 ` Josef Weidendorfer
2007-05-19 0:56 ` Torgil Svensson
2007-05-18 12:00 ` Jakub Narebski
2007-05-18 12:41 ` Petr Baudis
2007-05-19 16:38 ` Jakub Narebski
2007-05-18 18:37 ` Junio C Hamano
2007-05-18 18:40 ` Julian Phillips
2007-05-18 18:45 ` Junio C Hamano
2007-05-20 0:16 ` Petr Baudis
2007-05-25 9:55 ` News reader woes (was: Re: [3/4] What's not in 1.5.2 (new topics)) Jakub Narebski
2007-05-18 7:57 ` [3/4] What's not in 1.5.2 (new topics) Andy Parkins
2007-05-18 8:43 ` Josef Weidendorfer
2007-05-18 9:21 ` Andy Parkins
2007-05-18 11:08 ` Michael S. Tsirkin
2007-05-18 12:27 ` Josef Weidendorfer
2007-05-18 12:46 ` Michael S. Tsirkin
2007-05-18 15:06 ` Aidan Van Dyk
2007-05-18 15:31 ` Michael S. Tsirkin
2007-05-19 12:50 ` Sven Verdoolaege
2007-05-21 1:10 ` Jakub Narebski
2007-05-18 17:00 ` Junio C Hamano
2007-05-19 18:12 ` Michael S. Tsirkin
2007-05-19 19:56 ` Junio C Hamano
2007-05-18 8:57 ` Michael S. Tsirkin
2007-05-18 9:40 ` Andy Parkins
2007-05-18 10:16 ` Johannes Sixt
2007-05-18 11:22 ` Michael S. Tsirkin
2007-05-18 12:36 ` Andy Parkins
2007-05-19 1:02 ` Steven Grimm
2007-05-19 16:55 ` Josef Weidendorfer
[not found] ` <200705181524.40705.Josef.Weidendorfer@gmx.de>
[not found] ` <20070518133922.GK4708@mellanox.co.il>
[not found] ` <200705181751.15435.Josef.Weidendorfer@gmx.de>
2007-05-18 16:08 ` Petr Baudis
2007-05-18 16:21 ` Michael S. Tsirkin
2007-05-16 22:47 ` [4/4] What's not in 1.5.2 (other bits and pieces) Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200705170539.11402.andyparkins@gmail.com \
--to=andyparkins@gmail.com \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).