diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-02-15 23:57:26 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-02-15 23:57:26 -0800 |
commit | 1fe32cb9d0807e6da468dc7bf96d427b2f38c1c4 (patch) | |
tree | 6357e45b20095750fa5665349b5aa598f88ef8a7 | |
parent | 0ef617f4b6ea78ad63dd11e90f8c854238176981 (diff) | |
download | git-1fe32cb9d0807e6da468dc7bf96d427b2f38c1c4.tar.gz git-1fe32cb9d0807e6da468dc7bf96d427b2f38c1c4.tar.xz |
filter-branch: handle filenames that need quoting
The command used a very old fashioned construct to extract
filenames out of diff-index and ended up corrupting the output.
We can simply use --name-only and pipe into --stdin mode of
update-index. It's been like that for the past 2 years or so
since a94d994 (update-index: work with c-quoted name).
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-x | git-filter-branch.sh | 9 | ||||
-rwxr-xr-x | t/t7003-filter-branch.sh | 14 |
2 files changed, 19 insertions, 4 deletions
diff --git a/git-filter-branch.sh b/git-filter-branch.sh index ff716cabb..49e13f0bb 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -276,10 +276,11 @@ while read commit parents; do eval "$filter_tree" < /dev/null || die "tree filter failed: $filter_tree" - git diff-index -r $commit | cut -f 2- | tr '\012' '\000' | \ - xargs -0 git update-index --add --replace --remove - git ls-files -z --others | \ - xargs -0 git update-index --add --replace --remove + ( + git diff-index -r --name-only $commit + git ls-files --others + ) | + git update-index --add --replace --remove --stdin fi eval "$filter_index" < /dev/null || diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh index 5f60b22d8..868babc4b 100755 --- a/t/t7003-filter-branch.sh +++ b/t/t7003-filter-branch.sh @@ -165,4 +165,18 @@ test_expect_success '"map" works in commit filter' ' git rev-parse --verify master ' +test_expect_success 'Name needing quotes' ' + + git checkout -b rerere A && + mkdir foo && + name="れれれ" && + >foo/$name && + git add foo && + git commit -m "Adding a file" && + git filter-branch --tree-filter "rm -fr foo" && + ! git ls-files --error-unmatch "foo/$name" && + test $(git rev-parse --verify rerere) != $(git rev-parse --verify A) + +' + test_done |