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

Re: "fatal: index-pack failed" on git-clone

From
Jeff King <peff@peff.net>
Date
Jul 9, 2009, 06:37 UTC
Message-ID
<20090709063735.GA22544@coredump.intra.peff.net>
In-Reply-To
<7vvdm26bbk.fsf@alter.siamese.dyndns.org>
On Wed, Jul 08, 2009 at 03:48:15PM -0700, Junio C Hamano wrote:
Show 10 quoted lines
> > However, if Fritz runs 'sudo /usr/local/bin/git clone ...', then the interim 
> > PATH is "/usr/local/bin:/usr/local/libexec/git-core:/bin:/usr/bin" because 
> > this time setup_path() finds a non-empty argv0_path, and the command works.
> 
> Ahh, that is what I was missing.
> 
> As I said elsewhere already, I personally do not think sudo is worth
> supporting compared to the cost of this kind of pain resulting from its
> misguided "safety" brokenness, but apparently it is widely used.  I think
> what Peff suggests in this thread might be a reasonable workaround.

Yes, I find sudo's restrictions silly, considering that most people use it to allow arbitrary code execution, which is why I wrote this some time ago:

  http://peff.net/tinysu/

However, sudo is pretty popular, and it should be easy enough for us to work around it in this case. Patch is below. It's longer than the one-liner necessary, because it now uses "git" as the magic "everything should link to this" file instead of "git-add", which I think is a bit more obvious.

-- >8 --
Subject: [PATCH] Makefile: install 'git' in execdir

When a git command executes a subcommand, it uses the "git foo" form, which relies on finding "git" in the PATH. Normally this should not be a problem, since the same "git" that was used to invoke git in the first place will be found. And if somebody invokes a "git" outside of the PATH (e.g., by giving its absolute path), this case is already covered: we put that absolute path onto the front of PATH.

However, if one is using "sudo", then sudo will execute the "git" from the PATH, but pass along a restricted PATH that may not contain the original "git" directory. In this case, executing a subcommand will fail.

To solve this, we put the "git" wrapper itself into the execdir; this directory is prepended to the PATH when git starts, so the wrapper will always be found.

Signed-off-by: Jeff King <peff@peff.net>
---
 Makefile |   14 +++++++-------
 1 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/Makefile b/Makefile
index 78cc113..311ce7d 100644
--- a/Makefile
+++ b/Makefile
@@ -1641,15 +1641,15 @@ ifneq (,$X)
 endif
 	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
 	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
-	{ $(RM) "$$execdir/git-add$X" && \
+	{ $(RM) "$$execdir/git$X" && \
 		test -z "$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
-		ln "$$bindir/git$X" "$$execdir/git-add$X" 2>/dev/null || \
-		cp "$$bindir/git$X" "$$execdir/git-add$X"; } && \
-	{ for p in $(filter-out git-add$X,$(BUILT_INS)); do \
+		ln "$$bindir/git$X" "$$execdir/git$X" 2>/dev/null || \
+		cp "$$bindir/git$X" "$$execdir/git$X"; } && \
+	{ for p in $(BUILT_INS); do \
 		$(RM) "$$execdir/$$p" && \
-		ln "$$execdir/git-add$X" "$$execdir/$$p" 2>/dev/null || \
-		ln -s "git-add$X" "$$execdir/$$p" 2>/dev/null || \
-		cp "$$execdir/git-add$X" "$$execdir/$$p" || exit; \
+		ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \
+		ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \
+		cp "$$execdir/git$X" "$$execdir/$$p" || exit; \
 	  done; } && \
 	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
 
-- 
1.6.3.3.529.g74caa.dirty
Previous: Junio C HamanoNext: Michael J Gruber
Message 15 of 18 in “"fatal: index-pack failed" on git-clone”
  1. Fritz AndersonJul 8, 2009
  2. Junio C HamanoJul 8, 2009
  3. Fritz AndersonJul 8, 2009
  4. Junio C HamanoJul 8, 2009
  5. Fritz AndersonJul 8, 2009
  6. Junio C HamanoJul 8, 2009
  7. Daniel BarkalowJul 8, 2009
  8. Fritz AndersonJul 8, 2009
  9. Fritz AndersonJul 8, 2009
  10. Johannes SixtJul 8, 2009
  11. Jeff KingJul 8, 2009
  12. Fritz AndersonJul 8, 2009
  13. Johannes SixtJul 9, 2009
  14. Junio C HamanoJul 8, 2009
  15. Jeff KingJul 9, 2009
  16. Michael J GruberJul 9, 2009
  17. A Large Angry SCMJul 9, 2009
  18. Jeff KingJul 13, 2009

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.