Merge branch 'bc/filter-branch'
* bc/filter-branch: filter-branch.sh: support nearly proper tag name filtering
This commit is contained in:
commit
e9dd751866
@ -133,10 +133,16 @@ use "--tag-name-filter cat" to simply update the tags. In this
|
|||||||
case, be very careful and make sure you have the old tags
|
case, be very careful and make sure you have the old tags
|
||||||
backed up in case the conversion has run afoul.
|
backed up in case the conversion has run afoul.
|
||||||
+
|
+
|
||||||
Note that there is currently no support for proper rewriting of
|
Nearly proper rewriting of tag objects is supported. If the tag has
|
||||||
tag objects; in layman terms, if the tag has a message or signature
|
a message attached, a new tag object will be created with the same message,
|
||||||
attached, the rewritten tag won't have it. Sorry. (It is by
|
author, and timestamp. If the tag has a signature attached, the
|
||||||
definition impossible to preserve signatures at any rate.)
|
signature will be stripped. It is by definition impossible to preserve
|
||||||
|
signatures. The reason this is "nearly" proper, is because ideally if
|
||||||
|
the tag did not change (points to the same object, has the same name, etc.)
|
||||||
|
it should retain any signature. That is not the case, signatures will always
|
||||||
|
be removed, buyer beware. There is also no support for changing the
|
||||||
|
author or timestamp (or the tag message for that matter). Tags which point
|
||||||
|
to other tags will be rewritten to point to the underlying commit.
|
||||||
|
|
||||||
--subdirectory-filter <directory>::
|
--subdirectory-filter <directory>::
|
||||||
Only look at the history which touches the given subdirectory.
|
Only look at the history which touches the given subdirectory.
|
||||||
|
@ -406,8 +406,22 @@ if [ "$filter_tag_name" ]; then
|
|||||||
echo "$ref -> $new_ref ($sha1 -> $new_sha1)"
|
echo "$ref -> $new_ref ($sha1 -> $new_sha1)"
|
||||||
|
|
||||||
if [ "$type" = "tag" ]; then
|
if [ "$type" = "tag" ]; then
|
||||||
# Warn that we are not rewriting the tag object itself.
|
new_sha1=$(git cat-file tag "$ref" |
|
||||||
warn "unreferencing tag object $sha1t"
|
sed -n \
|
||||||
|
-e "1,/^$/{
|
||||||
|
s/^object .*/object $new_sha1/
|
||||||
|
s/^type .*/type commit/
|
||||||
|
s/^tag .*/tag $new_ref/
|
||||||
|
}" \
|
||||||
|
-e '/^-----BEGIN PGP SIGNATURE-----/q' \
|
||||||
|
-e 'p' |
|
||||||
|
git mktag) ||
|
||||||
|
die "Could not create new tag object for $ref"
|
||||||
|
if git cat-file tag "$ref" | \
|
||||||
|
grep '^-----BEGIN PGP SIGNATURE-----' >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
warn "gpg signature stripped from tag object $sha1t"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git update-ref "refs/tags/$new_ref" "$new_sha1" ||
|
git update-ref "refs/tags/$new_ref" "$new_sha1" ||
|
||||||
|
@ -219,4 +219,36 @@ test_expect_success 'Subdirectory filter with disappearing trees' '
|
|||||||
test $(git rev-list master | wc -l) = 3
|
test $(git rev-list master | wc -l) = 3
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'Tag name filtering retains tag message' '
|
||||||
|
git tag -m atag T &&
|
||||||
|
git cat-file tag T > expect &&
|
||||||
|
git filter-branch -f --tag-name-filter cat &&
|
||||||
|
git cat-file tag T > actual &&
|
||||||
|
git diff expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
faux_gpg_tag='object XXXXXX
|
||||||
|
type commit
|
||||||
|
tag S
|
||||||
|
tagger T A Gger <tagger@example.com> 1206026339 -0500
|
||||||
|
|
||||||
|
This is a faux gpg signed tag.
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
Version: FauxGPG v0.0.0 (FAUX/Linux)
|
||||||
|
|
||||||
|
gdsfoewhxu/6l06f1kxyxhKdZkrcbaiOMtkJUA9ITAc1mlamh0ooasxkH1XwMbYQ
|
||||||
|
acmwXaWET20H0GeAGP+7vow=
|
||||||
|
=agpO
|
||||||
|
-----END PGP SIGNATURE-----
|
||||||
|
'
|
||||||
|
test_expect_success 'Tag name filtering strips gpg signature' '
|
||||||
|
sha1=$(git rev-parse HEAD) &&
|
||||||
|
sha1t=$(echo "$faux_gpg_tag" | sed -e s/XXXXXX/$sha1/ | git mktag) &&
|
||||||
|
git update-ref "refs/tags/S" "$sha1t" &&
|
||||||
|
echo "$faux_gpg_tag" | sed -e s/XXXXXX/$sha1/ | head -n 6 > expect &&
|
||||||
|
git filter-branch -f --tag-name-filter cat &&
|
||||||
|
git cat-file tag S > actual &&
|
||||||
|
git diff expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user