Ответы, использующие даты коммиттера, являются хорошим направлением ... если вы хотите удалить ветки, которые указывают на старые коммиты.Но вы можете удалить ветки, которые на самом деле старые;если сегодня вы создаете ветку, указывающую на коммит с прошлого года, вы не хотите, чтобы он был стёрт!
Итак, вместо этого вы хотите проверить даты рефлога.
Вы можете получить человека-читаемая форма с git reflog show --date=local mybranch
:
8b733bc mybranch@{Tue Mar 22 13:21:49 2011}: commit: foo
7e36e81 mybranch@{Tue Mar 22 13:21:25 2011}: commit: bar
99803da mybranch@{Tue Mar 22 13:20:45 2011}: branch: Created from otherbranch
(Вам также может понравиться --date=relative
)
Запись сверху - это самое последнее, что произошло в этой ветви, так чтонемного, мы заботимся о.К сожалению, нет места для формата журнала только для даты, поэтому, чтобы получить только дату, мы проделали небольшую работу:
git log -g -n 1 --date=local --pretty=%gd mybranch | sed 's/.*{\(.*\)}/\1/'
# Prints "Mon Mar 21 13:23:26 2011"
Конечно, для сценариев это не очень полезно, так что давайте продолжими вместо этого получите время эпохи:
git log -g -n 1 --date=raw --pretty=%gd mybranch | sed 's/.*{\(.*\) .*/\1/'
# Prints 1300731806
Теперь мы кое-что получаем!
#!/bin/bash
cutoff_date=$(date --date="July 23, 2010" +%s)
git for-each-ref refs/heads --format='%(refname)' | while read branch; do
reflog_date=$(git log -g -n 1 --date=raw --pretty=%gd $branch -- | sed 's/.*{\(.*\) .*/\1/')
if [ -n "$reflog_date" && "$reflog_date" -lt "$cutoff_date" ]; then
git branch -D ${branch#refs/heads/}
fi
done
Пример сценария!Я использовал date
, чтобы преобразовать удобочитаемую дату для отсечения, затем для каждой ветви я проверил, была ли последняя дата reflog перед отсечкой, и если так, удалил ветку.Вы можете добавить чек против белого списка, чтобы уберечь себя от случайного удаления того, что вам небезразлично.(Изменить: если ветки старше 90 дней, это не удалит их, потому что их reflogs уже будут пустыми ... в зависимости от того, что вы хотите сделать в этом случае, на самом деле. Вы можете вернуться к проверкедата коммиттера, которая в этот момент должна быть довольно безопасной.)
Редактировать: Вот другой подход.Срок действия повторных журналов истекает во время отсечения, затем удалите ветки, чьи флажки пусты.Проблема здесь в том, что если время отсечения старше, чем время, когда ваши повторные журналы уже истекают (90 дней), то на самом деле они просто удалят ветки старше 90 дней.Вы можете обойти это, конечно.
#!/bin/bash
# Git lets you use very readable time formats!
cutoff_time="1 year ago"
# other examples:
# cutoff_time="July 23, 2010"
# cutoff_time="yesterday"
git for-each-ref refs/heads --format='%(refname)' | egrep -v 'master|other-whitelisted-branch' |
while read branch; do
git reflog expire --expire="$cutoff_time" $branch
if [ "$(git reflog show -1 $branch | wc -l)" -eq 0 ]; then
git branch -D ${branch#refs/heads/}
fi
done