diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-03-11 00:38:29 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-03-11 00:38:29 -0700 |
commit | 92aeb994d3195d3601df2e37052d60f9a6738b61 (patch) | |
tree | a6eb221be005f0af2eb0b16f5c4eb07cd8b0b90c | |
parent | b50396d16cb687eccb2c2c9160b30f17e20a543f (diff) | |
parent | 5b044ac3879b0950675f0e762f1dccbbb9f4001e (diff) | |
download | git-92aeb994d3195d3601df2e37052d60f9a6738b61.tar.gz |
Merge branch 'kb/maint-filter-branch-disappear' into maint
* kb/maint-filter-branch-disappear:
filter-branch: handle "disappearing tree" case correctly in subdir filter
-rwxr-xr-x | git-filter-branch.sh | 11 | ||||
-rwxr-xr-x | t/t7003-filter-branch.sh | 24 |
2 files changed, 34 insertions, 1 deletions
diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 49e13f0bb1..010353ad82 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -252,7 +252,16 @@ while read commit parents; do git read-tree -i -m $commit ;; *) - git read-tree -i -m $commit:"$filter_subdir" + # The commit may not have the subdirectory at all + err=$(git read-tree -i -m $commit:"$filter_subdir" 2>&1) || { + if ! git rev-parse --verify $commit:"$filter_subdir" 2>/dev/null + then + rm -f "$GIT_INDEX_FILE" + else + echo >&2 "$err" + false + fi + } esac || die "Could not initialize the index" GIT_COMMIT=$commit diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh index 868babc4b2..6e14bf1c7f 100755 --- a/t/t7003-filter-branch.sh +++ b/t/t7003-filter-branch.sh @@ -179,4 +179,28 @@ test_expect_success 'Name needing quotes' ' ' +test_expect_success 'Subdirectory filter with disappearing trees' ' + git reset --hard && + git checkout master && + + mkdir foo && + touch foo/bar && + git add foo && + test_tick && + git commit -m "Adding foo" && + + git rm -r foo && + test_tick && + git commit -m "Removing foo" && + + mkdir foo && + touch foo/bar && + git add foo && + test_tick && + git commit -m "Re-adding foo" && + + git filter-branch -f --subdirectory-filter foo && + test $(git rev-list master | wc -l) = 3 +' + test_done |