Как я могу получить список веток 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.