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

[PATCH] submodules: ensure clean environment when operating in a submodule

From
Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Date
Feb 22, 2010, 22:16 UTC
Message-ID
<1266877015-7943-1-git-send-email-giuseppe.bilotta@gmail.com>
In-Reply-To
<20100218203726.GD12660@book.hvoigt.net>

git-submodule takes care of clearing GIT_DIR whenever it operates on a submodule index or configuration, but forgot to unset GIT_WORK_TREE before operating on the submodule worktree, which would lead to failures when GIT_WORK_TREE was set.

This only happened in very unusual contexts such as operating on the main worktree from outside of it, but since "git-gui: set GIT_DIR and GIT_WORK_TREE after setup" (a9fa11fe5bd5978bb) such failures could also be provoked by invoking an external tool such as "git submodule update" from the Git GUI in a standard setup.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
---
 git-submodule.sh |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

The bug (git submodules not working in Git GUI since my patch) was spotted by Heiko Voigt working on/with msysgit, and he kindly provided a recipe to replicate it: http://article.gmane.org/gmane.comp.version-control.msysgit/8755

I'm pretty confident fixing this on the submodules side is the more correct approach, since otherwise even a simple $ GIT_WORK_TREE=. git submodule update on the command-line can fail.

I also believe this is material for git maint.
diff --git a/git-submodule.sh b/git-submodule.sh
index 5869c00..69afc84 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -223,6 +223,7 @@ cmd_add()
 		module_clone "$path" "$realrepo" "$reference" || exit
 		(
 			unset GIT_DIR
+			unset GIT_WORK_TREE
 			cd "$path" &&
 			# ash fails to wordsplit ${branch:+-b "$branch"...}
 			case "$branch" in
@@ -279,6 +280,7 @@ cmd_foreach()
 			(
 				prefix="$prefix$path/"
 				unset GIT_DIR
+				unset GIT_WORK_TREE
 				cd "$path" &&
 				eval "$@" &&
 				if test -n "$recursive"
@@ -477,7 +479,7 @@ cmd_update()
 				;;
 			esac
 
-			(unset GIT_DIR; cd "$path" && $command "$sha1") ||
+			(unset GIT_DIR; unset GIT_WORK_TREE; cd "$path" && $command "$sha1") ||
 			die "Unable to $action '$sha1' in submodule path '$path'"
 			say "Submodule path '$path': $msg '$sha1'"
 		fi
@@ -771,6 +773,7 @@ cmd_status()
 			(
 				prefix="$displaypath/"
 				unset GIT_DIR
+				unset GIT_WORK_TREE
 				cd "$path" &&
 				cmd_status $orig_args
 			) ||
-- 
1.7.0.199.g49ef3.dirty
Next: Junio C Hamano
Message 1 of 15 in “submodules: ensure clean environment when operating in a submodule”
  1. submodules: ensure clean environment when operating in a submoduleGiuseppe Bilotta, Feb 22, 2010
  2. Junio C HamanoFeb 22, 2010
  3. Giuseppe BilottaFeb 22, 2010
  4. Junio C HamanoFeb 22, 2010
  5. 1/2 shell setup: clear_local_git_env() functionGiuseppe Bilotta, Feb 22, 2010
  6. Johannes SixtFeb 23, 2010
  7. Giuseppe BilottaFeb 23, 2010
  8. 0/2 clear environment for submodulesGiuseppe Bilotta, Feb 23, 2010
  9. 1/2 shell setup: clear_local_git_env() functionGiuseppe Bilotta, Feb 23, 2010
  10. Jens LehmannFeb 23, 2010
  11. 2/2 submodules: ensure clean environment when operating in a submoduleGiuseppe Bilotta, Feb 23, 2010
  12. 2/2 submodules: ensure clean environment when operating in a submoduleGiuseppe Bilotta, Feb 22, 2010
  13. Johannes SchindelinFeb 23, 2010
  14. Heiko VoigtFeb 23, 2010
  15. Johannes SchindelinFeb 23, 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.