My first thought was to fetch just the tags from an upstream copy of the Linux kernel I had on my local machine:
git fetch -t ~/linus
Unfortunately I hadn't thought that though very well, as that local tree also contained all the tags from the linux-next tree, the tip tree as well as a whole bunch more from various distro trees and several other random ones, which I didn't want cluttering up my copy of the pandaboard kernel tree.
This lead me to try to find a way to delete all the non-ancestor tags (compared to the current branch) to simplify the tree. This may be useful to others to remove unused objects and make the tree smaller after a git gc -- that didn't factor into my needs as I had specified ~/linus to git clone with --reference so the objects were being shared.
Anyway, this is the script I came up with, note that this only compares the tags with the ancestors of the *current HEAD*, so you should be careful that you are on a branch with all the tags you want to keep first. Alternatively you could modify this script to collate the ancestor tags of every local/remote branch first, though this is left as an exercise for the reader.
#!/bin/sh
ancestor_tags=$(mktemp)
echo -n Looking up ancestor tags...\
git log --simplify-by-decoration --pretty='%H' > $ancestor_tags
echo done.
for tag in $(git tag --list); do
echo -n "$tag"
commit=$(git show "$tag" | awk '/^commit [0-9a-f]+$/ {print $2}' | head -n 1)
echo -n ...\
if [ -z "$commit" ]; then
echo has no commit, deleting...
git tag -d "$tag"
continue
fi
if grep $commit $ancestor_tags > /dev/null; then
echo is an ancestor
else
echo is not an ancestor, deleting...
git tag -d "$tag"
fi
done
rm -fv $ancestor_tags
Also note that this may still leave unwanted tags in if they are a direct ancestor of the current HEAD - for instance, I found a bunch of tags from the tip tree had remained afterwards, but they were much more manageable to delete with a simple for loop and a pattern.
No comments:
Post a Comment