Подтвердить что ты не робот

Как перечислить только активные/недавно измененные ветки в git?

Я иногда работаю с репозиториями исходного кода, содержащими много ветвей, большинство из которых старые и обычно больше не актуальны.

В этих случаях полный список ветвей из git branch не очень полезен. Есть ли способ перечислить только "активные" ветки? Например, только те ветки, которые получили фиксации в последние n дней? В идеале, список будет включать последнюю дату фиксации для каждой ветки и указать, если ветвь уже полностью объединена.

P.S.: Я понимаю, что это также можно решить, удалив "старые" ветки (как обсуждалось, например, в Что делать с экспериментальными не объединенными ветвями git?), но это может не всегда быть практичным или принято в данном проекте.

4b9b3361

Ответ 1

Вы можете использовать git-for-each-ref, чтобы получить список всех локальных ветвей и ветвей отслеживания, отсортированных в порядке убывания, по дате коммиттера последней фиксации следующим образом:

git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes

Это выдает, например:

2012-06-23 refs/heads/master
2012-06-21 refs/remotes/origin/HEAD
2012-06-21 refs/remotes/origin/master

Вы можете добавить --count=m, чтобы получить не более m ветвей, вы можете --sort=-authordate вместо использования даты коммиттера, вы можете, конечно, использовать разные форматы. for-each-ref сам не ограничивает результат по дате, это должно быть написано отдельно, но по крайней мере у вас есть даты от объекта commit в руке.

Ответ 2

ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done;

Этот oneliner печатает все локальные ветки, отсортированные по времени от самых новых до самых старых. Каждая ветвь имеет последнюю фиксацию с понятной для пользователя строкой даты. Вы можете добавить его в свой .gitconfig.

Для удаленных веток я придумал это жуткое решение:

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $( echo $b | cut -d' ' -f1 ) --; done | sort -rn -k1,10 | cut -c11-

Изменить: Чем больше я думаю, тем больше я боюсь, что это может быть ненадежным, потому что ls-remote всегда подключается к удаленной стороне, тогда как log нет. Это может потребовать выполнить fetch перед каждым запуском этой команды.