Как я могу получить список веток Git, упорядоченных по последнему коммиту?


1324

Я хочу получить список всех веток в Git-репозитории с «самыми свежими» ветвями вверху, где «самая свежая» ветвь - это та, которая была зафиксирована совсем недавно (и, следовательно, с большей вероятностью будет одной Хочу обратить внимание)

Есть ли способ, которым я могу использовать Git, чтобы (а) отсортировать список ветвей по последнему коммиту или (б) получить список веток вместе с датой последнего коммита, в каком-то машиночитаемом формате?

В худшем случае я всегда мог запустить, git branchчтобы получить список всех ветвей, проанализировать его выходные данные, а затем git log -n 1 branchname --format=format:%ciдля каждой из них получить дату фиксации каждой ветви. Но это будет работать на Windows-боксе, где ускорение нового процесса является относительно дорогим, поэтому запуск исполняемого файла Git один раз на ветку может замедлиться, если имеется много ветвей. Есть ли способ сделать все это с помощью одной команды?


2
stackoverflow.com/a/2514279/1804124 Имеет лучший ответ.
Spundun

12
@Spundun, ты потерял меня там. Каким образом сочетание нескольких команд, включая данные, передаваемые через perl и sed, «лучше», чем использование команды, уже имеющейся в Git?
Джо Уайт

37
@Spundun относительно ответа git for-each-refот Jakub Narębski: вы можете получить удаленные ветви, проходящие refs/remotes/вместо refs/heads/(или вы можете передать оба, разделенные пробелами ); refs/tags/для тегов, или только refs/для всех трех видов.
jakub.g

4
Начиная с git 2.7 (4 квартал 2015 года), не более for-each-ref! Вы будете использовать напрямую git branch --sort=-committerdate: см. Мой ответ ниже
VonC

1
Возможно, дубликат stackoverflow.com/questions/9236219/…
Ондра Жижка

Ответы:


1874

Используйте --sort=-committerdateопцию git for-each-ref;

Также доступно с Git 2.7.0 для git branch:

Основное использование:

git for-each-ref --sort=-committerdate refs/heads/

# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate  # DESC
git branch --sort=committerdate  # ASC

Результат:

Результат

Расширенное использование:

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

Результат:

Результат


15
Отлично! Я даже могу ограничить вывод только именами ссылок, добавив --format=%(refname).
Джо Уайт

35
Это лучше для меня:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius: почему бы не использовать :shortname?
Якуб Наребски

37
@ilius: Как @BeauSmith писал: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. Страница руководства git-for-each-ref (1) гласит: « Для недвусмысленного краткого названия ссылки на приложение :short.
Якуб Наребски

76
Это цветная версия, включающая хэши, сообщения, упорядоченные по возрастанию на основе даты принятия, с указанием относительного возраста последнего принятия в каждой ветви. Я украл все идеи у вас, ребята выше. Это в моем .gitconfig в [alias]разделе, и мне это нравится. br = for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
Майкл Перси

124

Список имен веток Git, упорядоченный по последним коммитам…

Расширяя ответ Якуба и подсказку Джо , следующее исключит «refs /heads», поэтому в выводе будут отображаться только имена ветвей:


Команда:

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

Результат:

Недавние ветки Git


4
Вы также можете использовать --format=%(refname:short)вместо того, чтобы полагаться на cut.
Чайтанья Гупта

3
Есть ли способ сделать это для удаленного хранилища?
Аллан Боу

10
aah - @ jakub.g уже объяснил: вы можете получить удаленные ветви, передавая refs / remotes / вместо refs /heads /. Отлично!!
Аллан Боу

Мне нравится этот, если вы пытаетесь сделать псевдоним, который я сделал, чтобы не git rbзабыть git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
заключить

2
И теперь вы можете сделать это с помощью git branch, так что получение локальной, удаленной или всех веток работает как в git-branch (то есть -r, -a). git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
phord

89

Вот оптимальный код, который объединяет два других ответа:

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

10
Даже немного более оптимизирован для получения табличного вывода:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi

2
по какой - то причине я должен был использовать двойные кавычки , на окнах, но в остальном они работают нормально :)
amenthes

1
@schoetbi Этот код выглядит точно так же, как и у Николая. Что вы изменили, чтобы сделать его табличным?
Энрико

@ Энрико и другие, которые могут задуматься о том же. Николай изменил свой ответ, используя предложение Шоетбиса. Если сначала переместить дату, которая всегда будет одинаковой длины, результат будет более табличным.
Джонни

83

Вот простая команда, которая перечисляет все ветви с последними коммитами:

git branch -v

Чтобы упорядочить по последнему коммиту, используйте

git branch -v --sort=committerdate

Источник: http://git-scm.com/book/en/Git-Branching-Branch-Management


11
git branch -avесли вы хотите увидеть нелокальные ветви тоже.
Скотт Стаффорд

34
Это не сортирует по дате фиксации в соответствии с вопросом.
Cas

1
Легко ли получить git branch -vуказанную дату каждого коммита?
Дамблдад

1
как насчет <pre> git branch -v --sort = committerdate </ pre>?
Ирадж Джелодари

2
Это круто. Мне нравится git branch -va --sort=-committerdateпоказывать нелокальные ветви с самыми последними измененными ветками вверху.
Клинтон Блэкмор

61

Я использую следующий псевдоним:

recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"

который производит:

Результат

Используйте '|' разделять.


1
Отличный псевдоним! Я бы предложил column -ts'|'и символы конвейера, если запятая может встречаться в относительных временных метках в вашем регионе.
Бьорн Линдквист

1
отличный псевдоним, большое спасибо. Вы можете улучшить его, чтобы показать текущую ветвь другим цветом или с * в начале?
elhadi dp ıpɐɥ ן ǝ

2
По крайней мере, в последней версии git вы можете просто добавить '%(HEAD) ...'в начале строку формата, чтобы получить тот же эффект без передачи по sedкоманде
Joshua Skrzypek

5
Я не мог это сделать, чтобы работать как псевдоним. Я должен был использовать[alias] recent = !git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'
Уэсли Смит

11
Я должен был добавить --color = всегда, чтобы получить цвет. git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always|column -ts'|'}
user3342930

40

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

git for-each-ref --sort = -committerdate refs / heads / --format = '% (автор: короткий)% (цвет: красный)% (имя объекта: короткий)% (цвет: желтый)% (имя: короткий )% (цвет: сброс) (% (цвет: зеленый)% (фиксация: относительная)% (цвет: сброс)) '

Скриншот вывода


1
Это выглядит красиво, более красочно, чем использование прямой ветки git, как я предложил в stackoverflow.com/a/33163401/6309 . +1
VonC

2
Этот, в отличие от некоторых других, сработал для меня из коробки, поэтому я проголосовал за него.
Кейси

1
Работал, как это действительно приятно! Спасибо! :-)
FrozenTarzan

1
То же самое - это сработало из коробки, в отличие от ряда других, которые я только что попробовал. Спасибо.
Дан Ниссенбаум

2
Этот чистый и аккуратный. Когда-нибудь я бы добавил пульт и имя автора как это: git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
ywu

38

Мне также были нужны цвета, теги и удаленные ссылки без дубликатов:

for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'

Поскольку цитирование может быть трудным, вот псевдоним для Bash:

alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"

$ <ваша команда здесь> awk: синтаксическая ошибка рядом со строкой 1 awk: выход из строя рядом со строкой 1
Джейми Мейсон

@GotNoSugarBaby Вы используете одинарные кавычки, как в примере, верно? какую оболочку вы используете? В противном случае Bash придает этому персонажу особое значение.
Эстани

эй, я запустил это в / bin / bash (GNU bash, версия 4.0.28 (1) -релиз (i386-pc-solaris2.11)) с прямым копированием и вставкой вашего примера - но с тех пор я запустил он находится на / bin / bash (GNU bash, версия 3.2.48 (1) -релиз (x86_64-apple-darwin12)) и работает, поэтому я уберу отрицательный голос. Большое спасибо, Эстани.
Джейми Мейсон

@ GotNoSugarBaby Я использую 4.2.25 (1) -релиз (x86_64-pc-linux-gnu) nad, пробовал на 3.x и работал. Я не уверен, что это была за проблема ... но она могла иметь проблему с git-версией, а не с bash. В любом случае, я рад, что это работает для вас!
Эстани

1
@MichaelDiscenza просто отправь все по голове. это было бы добавить | head -n20в конце. Если вы используете псевдоним, убедитесь, что это идет в кавычках.
Эстани

24

Другие ответы не позволяют проходить, -vvчтобы получить подробный вывод.

Итак, вот одна строка, которая сортирует git branch -vvпо дате фиксации, сохраняя цвет и т. Д .:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2

Если вы дополнительно хотите распечатать дату фиксации, вы можете использовать эту версию вместо:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-

Пример вывода:

2013-09-15   master                  da39a3e [origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09   my-feature              e5e6b4b [master: ahead 2, behind 25] WIP

Это, вероятно, более читаемый разделить на несколько строк:

git branch -vv --color=always | while read; do
    # The underscore is because the active branch is preceded by a '*', and
    # for awk I need the columns to line up. The perl call is to strip out
    # ansi colors; if you don't pass --color=always above you can skip this
    local branch=$(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g')
    # git log fails when you pass a detached head as a branch name.
    # Hide the error and get the date of the current head.
    local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
    echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-

Это также должно работать с другими аргументами git branch, например, -vvrдля перечисления ветвей удаленного отслеживания или -vvaдля списков как удаленных, так и локальных ветвей.


-vvможет быть действительно полезным, спасибо. Однако это решение по-прежнему порождает новые процессы для каждой ветви, которых ОП хотел избежать.
Musiphil

На самом деле git branchконкретно не определяет значение -vv, а только -v, поэтому -vvдолжно иметь то же значение, что и -v.
Musiphil

2
Это лучшее. А добавление -avv учитывает и удаленные ветки. Спасибо за это!
Гоферхан

@musiphil Моя страница руководства по git-ветке , раздел -v, -vv, --verboseсодержит следующее:If given twice, print the name of the upstream branch, as well
Perleone

@Perleone: я не знаю, как я получил эту информацию, но вы правы, и я исправлен. Спасибо!
Musiphil

23

Git 2.7 (четвертый квартал 2015 года) представит сортировку ветвлений с использованием непосредственно git branch:
см. commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 сентября 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 Sep 2015) и commit f65f139 , ... (23 сентября 2015 г.) Картик Наяк ( KarthikNayak) .
(Слиты Junio C Hamano - gitster- в фиксации 7f11b48 , 15 окт 2015)

В частности, зафиксируйте aedcb7d :

branch.c: используйте ref-filterAPI

Сделать « branch.c» использование « ref-filter» API - интерфейсы для переборе рефов сортировки. Это удаляет большую часть кода, используемого в ' branch.c', заменяя его вызовами к 'ref-filter библиотеку '.

Это добавляет опцию--sort=<key> :

Сортировка по ключу.
Приставка- для сортировки в порядке убывания значения.

Вы можете использовать --sort=<key> опцию несколько раз, и в этом случае последний ключ становится первичным ключом.

Поддерживаемые ключи такие же, как и вgit for-each-ref .
Порядок сортировки по умолчанию сортируется на основе полного имени (включая refs/...префикс). В нем сначала перечисляются отдельные HEAD (если есть), затем локальные ветви и, наконец, ветви с удаленным отслеживанием.

Вот:

git branch --sort=-committerdate 

Или (см. Ниже с Git 2.19)

# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch

Смотрите также коммит 9e46833 (30 октября 2015 г.) Картика Наяка ( KarthikNayak) .
При поддержке: Junio ​​C Hamano ( gitster) .
(Слиты Junio C Hamano - gitster- в фиксации 415095f , 3 ноября 2015)

При сортировке по числовым значениям (например --sort=objectsize) нет запасного сравнения, когда обе ссылки содержат одно и то же значение. Это может привести к неожиданным результатам (т. Е. Порядок перечисления ссылок с одинаковыми значениями не может быть заранее определен), как указал Йоханнес Сикст ( $ gmane / 280117 ).

Следовательно, откат к алфавитному сравнению на основе refname всякий раз, когда другой критерий равен .

$ git branch --sort=objectsize

*  (HEAD detached from fromtag)
      branch-two
      branch-one
      master

С Git 2.19 порядок сортировки может быть установлен по умолчанию.
git branchподдерживает конфиг branch.sort, вроде git tag, который уже был конфиг tag.sort.
См. Коммит 560ae1c (16 августа 2018 г.) Самюэля Мафтула (``) .
(Слиты Junio C Hamano - gitster- в фиксации d89db6f , 27 августа 2018)

branch.sort:

Эта переменная управляет порядком сортировки веток при отображении git-branch.
Без --sort=<value>предоставленной опции " " значение этой переменной будет использоваться по умолчанию.


Для просмотра удаленных веток используйте git branch -r --sort=objectsize. -rФлаг заставляет его в список удаленных филиалов вместо местных отделений.


В Git 2.27 (Q2 2020) варианты git branch«и другие» for-each-ref«принимали несколько --sort=<key>вариантов в возрастающем порядке приоритета, но у него было несколько разрывов»--ignore-case обработки " и разрывов связей с refname, которые были исправлены.

См. Коммит 7c5045f , коммит 76f9e56 (3 мая 2020 г.) Джеффа Кинга ( peff) .
(Слиты Junio C Hamano - gitster- в фиксации 6de1630 , 08 мая 2020)

ref-filter: применять резервную сортировку refname только после всех пользовательских сортировок

Подписано: Джефф Кинг

Фиксировать 9e468334b4 ( « ref-filter: Откат по алфавиту сравнения», 2015-10-30, Git v2.7.0-RC0 - слияние перечисленного в партии # 10 ) cортировать Преподавал реф-фильтр для Отката к сравнивающим refnames.
Но он сделал это на неправильном уровне, отвергая результат сравнения для одного "--sort " ключа от пользователя, а не после того, как все ключи сортировки были исчерпаны.

Это работало правильно для одной --sortопции " ", но не для нескольких.
Мы разорвали бы любые связи в первом ключе с refname и никогда не оценивали бы второй ключ вообще.

Чтобы сделать вещи еще более интересными, мы иногда применяем этот запасной вариант!
Для поля типа " taggeremail", которое требует сравнения строк, мы действительно вернули бы результат strcmp(), даже если бы он был 0.
Но для числовых " value" полей типа " taggerdate" мы применили запасной вариант. И именно поэтому наш тест множественной сортировки пропустил это: он использует taggeremailв качестве основного сравнения.

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

Это действительно показывает ошибку, и исправление простое: перемещение запасного варианта во внешнюю compare_refs()функцию после того, как все ref_sortingключи были исчерпаны.

Обратите внимание, что во внешней функции у нас нет "ignore_case"флага, так как он является частью каждого отдельного ref_sortingэлемента. Это спорно , что такой запасной вариант должен делать, так как мы не использовали ключи пользователя в матч.
Но до сих пор мы пытались уважать этот флаг, поэтому наименее инвазивным является попытаться продолжать делать это.
Поскольку все вызывающие в текущем коде либо устанавливают флаг для всех ключей, либо для ни одного, мы можем просто извлечь флаг из первого ключа. В гипотетическом мире, где пользователь действительно может по отдельности переключать регистронезависимость клавиш, мы можем захотеть расширить код, чтобы отличать этот регистр от общего " --ignore-case".


Чтобы перечислить пульты с этой опцией, добавьте-r
Трой Дэниелс

@TroyDaniels Согласен. Вы можете редактировать ответ. Я рассмотрю ваши изменения.
VonC

19

Мне нравится использовать относительную дату и сокращать название филиала следующим образом:

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads

Что дает вам вывод:

21 minutes ago  nathan/a_recent_branch
6 hours ago     master
27 hours ago    nathan/some_other_branch
29 hours ago    branch_c
6 days ago      branch_d

Я рекомендую создать файл Bash для добавления всех ваших любимых псевдонимов, а затем поделиться сценарием с вашей командой. Вот пример, чтобы добавить только этот:

#!/bin/sh

git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"

Затем вы можете просто сделать это, чтобы получить хорошо отформатированный и отсортированный список локальных веток:

git branches

Обновление: Сделайте это, если хотите раскрасить:

#!/bin/sh
#
(echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"

Это дает мнеfatal: unknown field name: '-authordate:iso8601'
Фактор Мистик

1
Причудливая цветная продукция - это модно, но это просто и именно то, что я искал. Заменить refs/headsс , refs/remotesчтобы взглянуть на удаленных филиалах.
Ламбарт

Сама команда прекрасна, но псевдоним выдает ошибку:expansion of alias 'branches' failed; 'echo' is not a git command
Филипп Кан

Работает для меня. Что произойдет, если вы просто скопируете и вставите это в терминал? (echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
августа

17

Начиная с Git 2.19 вы можете просто:

git branch --sort=-committerdate

Вы также можете:

git config branch.sort -committerdate

Таким образом, всякий раз, когда вы перечисляете ветви в текущем репозитории, они будут перечислены отсортированными по committerdate.

Если каждый раз, когда вы перечисляете ветки, вы хотите, чтобы они сортировались по comitterdate:

git config --global branch.sort -committerdate

Отказ от ответственности: я являюсь автором этой функции в Git, и я реализовал ее, когда увидел этот вопрос.


2
Самый современный ответ, намного проще, чем использование сложных сценариев или псевдонимов 👌
mtefi

Используйте с осторожностью! Остерегайтесь всех, это не команда для перечисления ветвей. Это команда для изменения конфигурации Git, которая будет иметь постоянные глобальные последствия.
Джазимов

1
@ Джазимов, ты прав, я отредактировал ответ, чтобы он был понятнее
user801247

11

Добавляет немного цвета (так pretty-formatкак не доступно)

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"

9

У меня была такая же проблема, поэтому я написал рубиновый камень под названием Twig . В нем перечислены ветви в хронологическом порядке (сначала самые новые), а также можно указать максимальный возраст, чтобы вы не перечисляли все ветви (если их много). Например:

$ twig

                              issue  status       todo            branch
                              -----  ------       ----            ------
2013-01-26 18:00:21 (7m ago)  486    In progress  Rebase          optimize-all-the-things
2013-01-26 16:49:21 (2h ago)  268    In progress  -               whitespace-all-the-things
2013-01-23 18:35:21 (3d ago)  159    Shipped      Test in prod  * refactor-all-the-things
2013-01-22 17:12:09 (4d ago)  -      -            -               development
2013-01-20 19:45:42 (6d ago)  -      -            -               master

Он также позволяет хранить пользовательские свойства для каждой ветви, например, идентификатор заявки, статус, задачи и фильтровать список ветвей в соответствии с этими свойствами. Дополнительная информация: http://rondevera.github.io/twig/


5
Это имя может не помочь, так как я уверен, что есть несколько программ с таким же именем.
торок

8

Я придумал следующую команду (для Git 2.13 и позже):

git branch -r --sort=creatordate \
    --format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
    | grep -v ";HEAD$" \
    | column -s ";" -t

Если у вас нет, columnвы можете заменить последнюю строку на

    | sed -e "s/;/\t/g"

Выход выглядит как

6 years ago             Tom Preston-Werner  book
4 years, 4 months ago   Parker Moore        0.12.1-release
4 years ago             Matt Rogers         1.0-branch
3 years, 11 months ago  Matt Rogers         1.2_branch
3 years, 1 month ago    Parker Moore        v1-stable
12 months ago           Ben Balter          pages-as-documents
10 months ago           Jordon Bedwell      make-jekyll-parallel
6 months ago            Pat Hawks           to_integer
5 months ago            Parker Moore        3.4-stable-backport-5920
4 months ago            Parker Moore        yajl-ruby-2-4-patch
4 weeks ago             Parker Moore        3.4-stable
3 weeks ago             Parker Moore        rouge-1-and-2
19 hours ago            jekyllbot           master

Я написал сообщение в блоге о том, как работают различные части.


Ницца. +1. Он использует git branch --sortя упомянул в stackoverflow.com/a/33163401/6309 .
VonC

@DanNissenbaum Убедитесь, что вы используете Git 2.13 (выпущен в мае 2017 года) или позже.
Bdesham

7

К вашему сведению, если вы хотите получить список недавно проверенных веток (в отличие от недавно совершенных), вы можете использовать reflog Git:

$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything

Смотрите также: Как я могу получить список веток Git, которые я недавно проверил?


5

Вот небольшой скрипт, который я использую для переключения между последними ветками:

#!/bin/bash
# sudo bash

re='^[0-9]+$'

if [[ "$1" =~ $re ]]; then
    lines="$1"
else
    lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"

# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
    echo -n "Checkout to: "
    read index
done

branch="$( echo "$branches_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear

Используя эти два псевдонима:

recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'

Просто позвоните в Git-репозиторий, и он покажет вам последние N ветвей (по умолчанию 10) и число в каждой. Введите номер филиала, и он проверит:

Введите описание изображения здесь


4

Обычно мы рассматриваем удаленные филиалы в последнее время. Так попробуй это

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

Вот еще один скрипт, который делает то же, что и все остальные скрипты. Фактически, это обеспечивает функцию для вашей оболочки.

Его вклад заключается в том, что он вытягивает некоторые цвета из вашей конфигурации Git (или использует значения по умолчанию).

# Git Branch by Date
# Usage: gbd [ -r ]
gbd() {
    local reset_color=`tput sgr0`
    local subject_color=`tput setaf 4 ; tput bold`
    local author_color=`tput setaf 6`

    local target=refs/heads
    local branch_color=`git config --get-color color.branch.local white`

    if [ "$1" = -r ]
    then
        target=refs/remotes/origin
        branch_color=`git config --get-color color.branch.remote red`
    fi

    git for-each-ref --sort=committerdate $target --format="${branch_color}%(refname:short)${reset_color} ${subject_color}%(subject)${reset_color} ${author_color}- %(authorname) (%(committerdate:relative))${reset_color}"
}

3

Это основано на версии saeedgnu , но с текущей веткой, отмеченной звездочкой и цветом, и показывающей только то, что не описано как «месяцы» или «годы» назад:

current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
  --format='%(refname:short)|%(committerdate:relative)' \
  | grep -v '\(year\|month\)s\? ago' \
  | while IFS='|' read branch date
    do
      start='  '
      end=''
      if [[ $branch = $current_branch ]]; then
        start='* \e[32m'
        end='\e[0m'
      fi
      printf "$start%-30s %s$end\\n" "$branch" "$date"
    done

2

Мой лучший результат в виде сценария:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short)|%(committerdate:iso)|%(authorname)' |
    sed 's/refs\/heads\///g' |
    grep -v BACKUP  | 
    while IFS='|' read branch date author
    do 
        printf '%-15s %-30s %s\n' "$branch" "$date" "$author"
    done

1
Что за сценарий? Bash?
Питер Мортенсен

2

git branch --sort=-committerdate | head -5

Для любого, кто заинтересован в том, чтобы отсортировать только топ-5 названий веток на основе даты коммиттера.



1

Вот вариант, который я искал:

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

Это tail -rпереворачивает список, поэтому самый последний commiterdate- последний.


3
Вы также можете изменить --sort = -committerdate на --sort = committerdate для достижения этой цели.
переформатировать

Который tailимеет -r?
Кристоффер Хаммарстрем

1

Я передаю вывод принятого ответа в dialogинтерактивный список:

#!/bin/bash

TMP_FILE=/tmp/selected-git-branch

eval `resize`
dialog --title "Recent Git Branches" --menu "Choose a branch" $LINES $COLUMNS $(( $LINES - 8 )) $(git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:short)') 2> $TMP_FILE

if [ $? -eq 0 ]
then
    git checkout $(< $TMP_FILE)
fi

rm -f $TMP_FILE

clear

Сохранить как (например) ~/bin/git_recent_branches.shи chmod +xэто. Затем, git config --global alias.rb '!git_recent_branches.sh'чтобы дать мне новую git rbкоманду.


1

Я знаю, что ответов уже много, но вот мои два цента за простой псевдоним (мне нравится, когда моя последняя ветка внизу):

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

Это даст вам хороший обзор ваших последних 15 цветных веток с выделенной текущей веткой (она помечена звездочкой).


1

Были некоторые проблемы с обработкой одинарных кавычек на Mac в bash_profile при попытке установить псевдоним. Этот ответ помог решить его Как избежать одинарных кавычек в одинарных кавычках

Рабочий раствор:

alias gb='git for-each-ref --sort=committerdate refs/heads/ --format='"'"'%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'"'"''

PS Не могу комментировать из-за моей репутации


0

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))' это то что тебе нужно


0

Git v2.19 представляет branch.sortопцию конфигурации (см. Branch.sort ).

Так git branchбудет сортировать по дате коммиттера (desc) по умолчанию с

# gitconfig
[branch]
    sort = -committerdate     # desc

сценарий:

$ git config --global branch.sort -committerdate

Обновить:

Так,

$ git branch
* dev
  master
  _

а также

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.