Ok, the following is a series of six patches that implement some very low-level plumbing for what I consider sane subproject support. NOTE! I want to make it very clear that this series of patches does not make subprojects "usable". They are very core plumbing that allows people to think about the issues, and shows how the low-level code could (and in my opinion, should) be done. Some of the early patches are just cleanups and very basic stuff required to actually get to the meat of it all. I actually think that they are all in a state where they could be applied, if only because they don't actually really *do* anything unless you start generating index files entries (and trees) that have the "gitlink" entries in them. I've actually done some testing with a repository that has these kinds of subproject pointers in them, and no, it's really not fully fleshed out yet, but yes, I can actually do a commit in one of the subprojects, and when I do that, the "raw" diff literally looks like this: [torvalds@woody superproject]$ git diff --raw :160000 160000 5813084832d3c680a3436b0253639c94ed55445d 0000000... M sub-B and I can do a "git commit -a" in the superproject to commit the new state. NOTE! This series of six patches does not actually contain everything you need to do that - in particular, this series will not actually connect up the magic to make "git add" (and thus "git commit") actually create the gitlink entries for subprojects. That's another (quite small) patch, but I haven't cleaned it up enough to be submittable yet. I split my original larger patch up into more manageable pieces, so that you should be able to actually just read the patches themselves and get a reasonable idea about what it's doing, even *without* actually testing it. And obviously, "make test" still completes happily, if only because none of the tests actually trigger any of the new code. The patches are all fairly small, and the two first ones are really just totally independent cleanups/fixes: - diff-lib: use ce_mode_from_stat() rather than messing with modes manually: diff-lib.c | 15 +++------------ 1 files changed, 3 insertions(+), 12 deletions(-) - Avoid overflowing name buffer in deep directory structures: dir.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) - Add 'resolve_gitlink_ref()' helper function: refs.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ refs.h | 3 ++ 2 files changed, 82 insertions(+), 0 deletions(-) - Add "S_IFDIRLNK" file mode infrastructure for git links: cache.h | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) - Teach "fsck" not to follow subproject links: builtin-fsck.c | 9 ++++++++- tree.c | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) - Teach core object handling functions about gitlinks: builtin-ls-tree.c | 20 +++++++++++++++++++- cache-tree.c | 2 +- read-cache.c | 35 +++++++++++++++++++++++++++++++---- sha1_file.c | 3 +++ 4 files changed, 54 insertions(+), 6 deletions(-) and will follow in the next few emails.. Linus - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html