filter-branch: Fix fatal error on bare repositories
When git filter-branch is run on a bare repository, it prints out a fatal
error message:
  $ git filter-branch branch
  Rewrite 476c4839280c219c2317376b661d9d95c1727fc3 (9/9)
  WARNING: Ref 'refs/heads/branch' is unchanged
  fatal: This operation must be run in a work tree
Note that this fatal error message doesn't prevent git filter-branch from
exiting successfully. (Why doesn't git filter-branch actually exit with an
error when a shell command fails? I'm not sure why it was designed this
way.)
This error message is caused by the following section of code at the end of
git-filter-branch.sh:
  if [ "$(is_bare_repository)" = false ]; then
          unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE
          test -z "$ORIG_GIT_DIR" || {
                  GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR
          }
          ... elided ...
          git read-tree -u -m HEAD
  fi
The problem is the call to $(is_bare_repository), which is made before
GIT_DIR and GIT_WORK_TREE are restored.  This call always returns "false",
even when we're running in a bare repository.  But this means that we will
attempt to call 'git read-tree' even in a bare repository, which will fail
and print an error.
This patch modifies git-filter-branch.sh to restore the original
environment variables before trying to call is_bare_repository.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
			
			
				maint
			
			
		
							parent
							
								
									281907574c
								
							
						
					
					
						commit
						9273b56278
					
				|  | @ -442,19 +442,20 @@ rm -rf "$tempdir" | |||
|  | ||||
| trap - 0 | ||||
|  | ||||
| unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE | ||||
| test -z "$ORIG_GIT_DIR" || { | ||||
| 	GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR | ||||
| } | ||||
| test -z "$ORIG_GIT_WORK_TREE" || { | ||||
| 	GIT_WORK_TREE="$ORIG_GIT_WORK_TREE" && | ||||
| 	export GIT_WORK_TREE | ||||
| } | ||||
| test -z "$ORIG_GIT_INDEX_FILE" || { | ||||
| 	GIT_INDEX_FILE="$ORIG_GIT_INDEX_FILE" && | ||||
| 	export GIT_INDEX_FILE | ||||
| } | ||||
|  | ||||
| if [ "$(is_bare_repository)" = false ]; then | ||||
| 	unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE | ||||
| 	test -z "$ORIG_GIT_DIR" || { | ||||
| 		GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR | ||||
| 	} | ||||
| 	test -z "$ORIG_GIT_WORK_TREE" || { | ||||
| 		GIT_WORK_TREE="$ORIG_GIT_WORK_TREE" && | ||||
| 		export GIT_WORK_TREE | ||||
| 	} | ||||
| 	test -z "$ORIG_GIT_INDEX_FILE" || { | ||||
| 		GIT_INDEX_FILE="$ORIG_GIT_INDEX_FILE" && | ||||
| 		export GIT_INDEX_FILE | ||||
| 	} | ||||
| 	git read-tree -u -m HEAD | ||||
| fi | ||||
|  | ||||
|  |  | |||
|  | @ -39,7 +39,9 @@ test_expect_success 'result is really identical' ' | |||
| ' | ||||
|  | ||||
| test_expect_success 'rewrite bare repository identically' ' | ||||
| 	(git config core.bare true && cd .git && git filter-branch branch) | ||||
| 	(git config core.bare true && cd .git && | ||||
| 	 git filter-branch branch > filter-output 2>&1 && | ||||
| 	! fgrep fatal filter-output) | ||||
| ' | ||||
| git config core.bare false | ||||
| test_expect_success 'result is really identical' ' | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eric Kidd
						Eric Kidd