Commit a9da1663 authored by Johannes Sixt's avatar Johannes Sixt Committed by Junio C Hamano

filter-branch: Grok special characters in tag names

The tag rewriting code used a 'sed' expression to substitute the new tag
name into the corresponding field of the annotated tag object. But this is
problematic if the tag name contains special characters. In particular,
if the tag name contained a slash, then the 'sed' expression had a syntax
error. We now protect against this by using 'printf' to assemble the
tag header.
Signed-off-by: default avatarJohannes Sixt <>
Signed-off-by: default avatarJunio C Hamano <>
parent 5a4a088a
......@@ -416,15 +416,17 @@ if [ "$filter_tag_name" ]; then
echo "$ref -> $new_ref ($sha1 -> $new_sha1)"
if [ "$type" = "tag" ]; then
new_sha1=$(git cat-file tag "$ref" |
new_sha1=$( ( printf 'object %s\ntype commit\ntag %s\n' \
"$new_sha1" "$new_ref"
git cat-file tag "$ref" |
sed -n \
-e "1,/^$/{
s/^object .*/object $new_sha1/
s/^type .*/type commit/
s/^tag .*/tag $new_ref/
/^object /d
/^type /d
/^tag /d
}" \
-e '/^-----BEGIN PGP SIGNATURE-----/q' \
-e 'p' |
-e 'p' ) |
git mktag) ||
die "Could not create new tag object for $ref"
if git cat-file tag "$ref" | \
......@@ -250,4 +250,12 @@ test_expect_success 'Tag name filtering strips gpg signature' '
test_cmp expect actual
test_expect_success 'Tag name filtering allows slashes in tag names' '
git tag -m tag-with-slash X/1 &&
git cat-file tag X/1 | sed -e s,X/1,X/2, > expect &&
git filter-branch -f --tag-name-filter "echo X/2" &&
git cat-file tag X/2 > actual &&
test_cmp expect actual
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment