This fixes a total thinko in my original series: subprojects do *not* sort like directories, because the index is sorted purely by full pathname, and since a subproject shows up in the index as a normal NUL-terminated string, it never has the issues with sorting with the '/' at the end. So if you have a subproject "proj" and a file "proj.c", the subproject sorts alphabetically before the file in the index (and must thus also sort that way in a tree object, since trees sort as the index). In contrast, it you have two files "proj/file" and "proj.c", the "proj.c" will sort alphabetically before "proj/file" in the index. The index itself, of course, does not actually contain an entry "proj/", but in the *tree* that gets written out, the tree entry "proj" will sort before the file entry "proj.c", which is the only real magic sorting rule. In other words: the magic sorting rule only affects tree entries, and *only* affects tree entries that point to other trees (ie are of the type S_IFDIR). Anyway, that thinko just means that we should remove the special case to make S_ISDIRLNK entries sort like S_ISDIR entries. They don't. They sort like normal files. Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> --- Junio, you could just fix the patch that I sent out and rebase, but you seem to have merged it into "next" already, and besides, I think it's ok to have this separate correction patch just to explain *why* I was wrong to add that special case in the first place. Normally, I don't like leaving errors in the history - if they teach anybody anything, it is just to make more errors - but this may be one of the rare cases where the error was actually instructive. Linus --- diff --git a/read-cache.c b/read-cache.c index fde2427..795fc5d 100644 --- a/read-cache.c +++ b/read-cache.c @@ -280,9 +280,9 @@ int base_name_compare(const char *name1, int len1, int mode1, return cmp; c1 = name1[len]; c2 = name2[len]; - if (!c1 && (S_ISDIR(mode1) || S_ISDIRLNK(mode1))) + if (!c1 && S_ISDIR(mode1)) c1 = '/'; - if (!c2 && (S_ISDIR(mode2) || S_ISDIRLNK(mode2))) + if (!c2 && S_ISDIR(mode2)) c2 = '/'; return (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0; } - 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