filter-branch -d: Export GIT_DIR earlier

The improved error handling catches a bug in filter-branch when using
-d pointing to a path outside any git repository:

$ git filter-branch -d /tmp/foo master
fatal: Not a git repository (or any of the parent directories): .git

This error message comes from git for-each-ref in line 224. GIT_DIR is
set correctly by git-sh-setup (to the foo.git repository), but not
exported (yet).

Signed-off-by: Lars Noschinski <lars@public.noschinski.de>
Acked-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Lars Noschinski 2009-02-18 09:35:36 +01:00 committed by Junio C Hamano
parent 51b2ead03c
commit 88e38808cd
2 changed files with 18 additions and 6 deletions

View File

@ -220,6 +220,12 @@ die ""
# Remove tempdir on exit # Remove tempdir on exit
trap 'cd ../..; rm -rf "$tempdir"' 0 trap 'cd ../..; rm -rf "$tempdir"' 0
ORIG_GIT_DIR="$GIT_DIR"
ORIG_GIT_WORK_TREE="$GIT_WORK_TREE"
ORIG_GIT_INDEX_FILE="$GIT_INDEX_FILE"
GIT_WORK_TREE=.
export GIT_DIR GIT_WORK_TREE
# Make sure refs/original is empty # Make sure refs/original is empty
git for-each-ref > "$tempdir"/backup-refs || exit git for-each-ref > "$tempdir"/backup-refs || exit
while read sha1 type name while read sha1 type name
@ -234,12 +240,6 @@ do
esac esac
done < "$tempdir"/backup-refs done < "$tempdir"/backup-refs
ORIG_GIT_DIR="$GIT_DIR"
ORIG_GIT_WORK_TREE="$GIT_WORK_TREE"
ORIG_GIT_INDEX_FILE="$GIT_INDEX_FILE"
GIT_WORK_TREE=.
export GIT_DIR GIT_WORK_TREE
# The refs should be updated if their heads were rewritten # The refs should be updated if their heads were rewritten
git rev-parse --no-flags --revs-only --symbolic-full-name \ git rev-parse --no-flags --revs-only --symbolic-full-name \
--default HEAD "$@" > "$tempdir"/raw-heads || exit --default HEAD "$@" > "$tempdir"/raw-heads || exit

View File

@ -48,6 +48,18 @@ test_expect_success 'result is really identical' '
test $H = $(git rev-parse HEAD) test $H = $(git rev-parse HEAD)
' '
TRASHDIR=$(pwd)
test_expect_success 'correct GIT_DIR while using -d' '
mkdir drepo &&
( cd drepo &&
git init &&
test_commit drepo &&
git filter-branch -d "$TRASHDIR/dfoo" \
--index-filter "cp \"$TRASHDIR\"/dfoo/backup-refs \"$TRASHDIR\"" \
) &&
grep drepo "$TRASHDIR/backup-refs"
'
test_expect_success 'Fail if commit filter fails' ' test_expect_success 'Fail if commit filter fails' '
test_must_fail git filter-branch -f --commit-filter "exit 1" HEAD test_must_fail git filter-branch -f --commit-filter "exit 1" HEAD
' '