Hi everybody, I'm currently looking into more aggressively sharing space between multiple repositories, and into getting them to share again after one did a repack (which costs us 15G space). One thing I stumbled on is the /proc/sys/fs/protected_hardlinks stuff which disallows hardlinking pack files belonging to someone else. This consequently inhibits sharing when first cloning from a common shared cache repo. Installing git with CAP_FOWNER is probably too dangerous; at least the capability should only be enabled during the directory copying. * And the next thing is that copied object/pack files are created with mode rw-rw-r--, unlike those that come out of the regular transports. Apparent patch: diff --git a/builtin/clone.c b/builtin/clone.c index fd2c3ef090..6ffb4db4da 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -448,7 +448,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, die_errno(_("failed to create link '%s'"), dest->buf); option_no_hardlinks = 1; } - if (copy_file_with_time(dest->buf, src->buf, 0666)) + if (copy_file_with_time(dest->buf, src->buf, 0444)) die_errno(_("failed to copy file to '%s'"), dest->buf); } closedir(dir); Alas, copy_file takes the mode just as a crude hint to executability, so also: diff --git a/copy.c b/copy.c index 4de6a110f0..883060009c 100644 --- a/copy.c +++ b/copy.c @@ -32,7 +32,7 @@ int copy_file(const char *dst, const char *src, int mode) { int fdi, fdo, status; - mode = (mode & 0111) ? 0777 : 0666; + mode = (mode & 0111) ? 0777 : (mode & 0222) ? 0666 : 0444; if ((fdi = open(src, O_RDONLY)) < 0) return fdi; if ((fdo = open(dst, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) { (copy_file is also used with 0644 instead of the usual 0666 in refs/files-backend.c) Will submit as patch if acceptable; I'm not sure what the mode casing will do with other users. - Andreas -- "Totally trivial. Famous last words." From: Linus Torvalds <torvalds@*.org> Date: Fri, 22 Jan 2010 07:29:21 -0800