git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: init --shared=0666 isn't

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 9, 2010, 23:51 UTC
Message-ID
<7vy6i1uk8l.fsf@alter.siamese.dyndns.org>
In-Reply-To
<loom.20100309T224207-485@post.gmane.org>
Steve Folly <steve@spfweb.co.uk> writes:
Show 5 quoted lines
> $ git --git-dir=/tmp/shared.git fetch origin
>
> error: cannot open /tmp/shared.git/FETCH_HEAD: Permission denied
>
> FETCH_HEAD is owned by the original user, with 0644 permissions,

The shared repository support was [*1*] designed to help people setting up a "shared" repository like CVS/SVN, a central place people meet and exchange their histories by pushing into it and fetching from it. It was never designed to be used with a repository with a working tree, hence it was never designed to be used in repositories you would run "git pull" or "git merge" in.

However, it is not implausible for a sane workflow that you have to fetch into a central meeting place. You might be setting up a shared repository that also serves as a redistribution center for an external source, and in such a set-up, you would

 (1) clone/fetch from external "upstream";
 (2) allow people to fetch from it;
 (3) allow people to push into it.

So in that sense, allowing "git fetch" in such a shared central meeting place is not something we would want to actively forbid. But I thought we unlinked existing FETCH_HEAD and then opened to create it anew, so I am a bit puzzled why it matters who owns it and who can write into it.

    ... goes and looks ...

Ah, truncate_fetch_head() just opens it without unlinking. Probably a better fix might be to unlink and create the file, like the attached patch does, instead of running adjust_shared_perm().

> But, I wonder if there are other files written that will need fixing
> also - ORIG_HEAD, MERGE_HEAD?
These are created by "merge" and "reset", so it shouldn't matter.

By the way, the same applies to files in the working tree. We never call adjust_shared_perm() when creating them, and I do not think this is likely to change.

[Footnote]

*1* Notice the past tense---this is merely a statement of historical fact to help you understand _why_ the current system behaves that way and the conclusion does not necessarily have to be "hence it must remain that way".

diff --git a/builtin-fetch.c b/builtin-fetch.c
index b6c5b34..d73fa19 100644
--- a/builtin-fetch.c
+++ b/builtin-fetch.c
@@ -654,8 +654,11 @@ static void check_not_current_branch(struct ref *ref_map)
 static int truncate_fetch_head(void)
 {
 	char *filename = git_path("FETCH_HEAD");
-	FILE *fp = fopen(filename, "w");
+	FILE *fp;
 
+	if (unlink(filename) && errno != ENOENT)
+		return error("cannot unlink %s\n", filename);
+	fp = fopen(filename, "w");
 	if (!fp)
 		return error("cannot open %s: %s\n", filename, strerror(errno));
 	fclose(fp);
Previous: Steve Folly
Message 2 of 2 in “init --shared=0666 isn't”
  1. Steve FollyMar 9, 2010
  2. Junio C HamanoMar 9, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.