What gets bag-n-tagged
I just run a script that looks for branches that are more than 90 days old:
git for-each-ref --format='%(refname)' refs/remotes/origin | { exp=$(( $(date +'%s') - 7776000 )); while read ref; do if test ${exp} -gt $(git show -s --pretty=format:'%ct' $ref); then echo $ref fi done; }
I then email htcondor-devel to politely ask if I can bag-n-tag the branches listed.
When a branch gets bag-n-tagged
I create a tag with the name of the branch, ending in "-tag". So branch "foo" will get tagged with tag "foo-tag". I run the following git commands
git tag -a -m "Bag-n-tag branch foo" foo-tag foo # To create the foo-tag tag git push origin tag foo-tag # To publish the new tag git push origin :refs/heads/foo # To delete the branch
How to resurrect a branch
If a branch is overzealously deleted, it is easy to restore. You may still have the old reference around, so you could run
git push origin refs/remotes/origin/foo:refs/heads/foo
If you have only the tag, you can do the following
git branch foo foo-tag^{} git push origin foo:foo
Here is the actual script:
#!/bin/bash GIT_DIR=/p/condor/repository/CONDOR_SRC.git export GIT_DIR bag_n_tag() { trimmed_branch_name=$(echo $1 | sed 's|^refs/remotes/origin/||;s|^refs/heads/||') origin_ref=refs/remotes/origin/${trimmed_branch_name} cat <<TAGCOMMANDS git tag -a -m "Bag-n-tag branch ${trimmed_branch_name}" ${trimmed_branch_name}-tag "${origin_ref}" || { echo "Failed to create tag ${trimmed_branch_name}-tag"; exit 1; } git push origin tag ${trimmed_branch_name}-tag || { echo "Failed to push tag ${trimmed_branch_name}-tag to origin"; exit 1; } git push origin :refs/heads/${trimmed_branch_name} || { echo "Failed to delete branch ${trimmed_branch_name} from origin"; exit 1; } TAGCOMMANDS echo } ctime=$(date +'%s') ctime=$(( $ctime - 7776000 )) git for-each-ref refs/heads | while read sha1 type refname do # echo $refname branchname=$(if test "$type" != "commit"; then exit 0 fi # This should never happen, but being paranoid... if echo "$refname" | grep -qE 'refs/tags'; then exit 0; fi commitdate="$(git log --pretty=format:'%ct' -1 $sha1)" if test "$commitdate" -gt "$ctime"; then exit 0; fi echo $refname) if test -n "$branchname"; then bag_n_tag "$branchname" fi done
#!/bin/bash grep '^git tag' | \ sed 's/.\+refs\/remotes\/origin\//refs\/remotes\/origin\//;s/ ||.\+//' | \ while read ref; \ do echo "${ref##*/} $(git rev-list --count --left-right origin/master...${ref} | awk '{if($2 == "0") print "merged"; else print "unmerged"}') $(git log -1 --pretty=format:'%ct %an' $ref)"; done | \ sort -k2,2 -k4 | \ while read branch status authd author; \ do printf "%-45s %10s %s %s\n" "$branch" "$status" "$(date -d @$authd +'%F')" "$author"; done