Как я могу получить список веток Git, заказанных последним коммитом?
Я хочу получить список всех ветвей в репозитории Git с "самыми свежими" ветвями наверху, где "самый свежий" ветвь - это тот, который был зафиксирован совсем недавно (и, следовательно, он, скорее всего, будет одним из Я хочу обратить внимание).
Есть ли способ, с помощью которого я могу использовать Git для: (a) сортировки списка ветвей по последней фиксации или (b) получения списка ветвей вместе с каждой последней датой фиксации в каком-то машиночитаемом формате?
В худшем случае я всегда мог запустить git branch
чтобы получить список всех ветвей, проанализировать его вывод, а затем git log -n 1 branchname --format=format:%ci
для каждого из них, чтобы получить каждую дату фиксации ветки. Но это будет работать в ящике Windows, где разработка нового процесса будет относительно дорогостоящим, поэтому запуск исполняемого файла Git один раз на ветку может замедляться, если есть много ветвей. Есть ли способ сделать все это с помощью одной команды?
Ответы
Ответ 1
Используйте --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))'
Результат:
Ответ 2
Список имен веток Git, упорядоченных по последнему коммиту...
Расширяя раздел Jakubs answer и Joes tip, следующий текст удалит "refs/head/", поэтому в выводе будут отображаться только имена ветвей:
Команда:
git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'
Результат:
Ответ 3
Вот оптимальный код, который объединяет два других ответа:
git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
Ответ 4
Вот простая команда, в которой перечислены все ветки с последними коммитами:
git branch -v
Чтобы заказать последний фиксатор, используйте
git branch -v --sort=committerdate
Источник: http://git-scm.com/book/en/Git-Branching-Branch-Management
Ответ 5
Я использую следующий псевдоним:
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"
который производит:
Используйте '|' разделять.
Ответ 6
Мне также нужны были цвета, теги и удаленные ссылки без дубликатов:
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'"]++'"
Ответ 7
Я смог сослаться на предыдущие примеры, чтобы создать что-то, что лучше всего подходит для меня.
git for-each-ref --sort=-committerdate refs/heads/
--format='%(authordate:short) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset)
(%(color:green)%(committerdate:relative)%(color:reset))'
Ответ 8
Другие ответы, похоже, не позволяют передавать -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
, чтобы отобразить как удаленное отслеживание, так и локальные ветки.
Ответ 9
git 2.7 (Q4 2015) будет вводить сортировку ветвей, используя прямую git branch
:
См. Commit aa3bc55, commit aedcb7d, commit 1511b22, commit f65f139 ,... (23 Sep 2015), совершить aedcb7d, совершить 1511b22, совершить ca41799 (24 сентября 2015 года) и совершить f65f139 ,... (23 сентября 2015 года) от Karthik Наяк (KarthikNayak
).
(Слияние с Юнио С Хамано - gitster
- в совершении 7f11b48, 15 октября 2015 года)
В частности, зафиксируйте aedcb7d:
branch.c
: использовать API-интерфейсы ref-filter
Создайте ' branch.c
', используя ' ref-filter
' API для итерации с помощью сортировки refs. Это удаляет большую часть кода, используемого в " branch.c
", заменяя его вызовами в библиотеку " ref-filter
".
Он добавляет опцию --sort=<key>
:
Сортировка на основе заданного ключа.
Префикс -
сортировка в порядке убывания значения.
Вы можете использовать параметр --sort=<key>
несколько раз, и в этом случае последним ключом становится первичный ключ.
Поддерживаемые ключи такие же, как в git for-each-ref
.
Порядок сортировки по умолчанию сортируется на основе полного имени (включая refs/...
prefix). В нем перечислены отдельные главы (если они есть), а затем локальные ветки и, наконец, ветки удаленного отслеживания.
Вот:
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
(KarthikNayak
).
Помощник: Юнио С Хамано (gitster
).
(Слияние с Юнио С Хамано - gitster
- в совершении 415095f, 03 ноября 2015 года)
При сортировке по числовым значениям (например, --sort=objectsize
) нет никакого сравнительного сравнения, когда оба ref сохраняют одно и то же значение. Это может привести к неожиданным результатам (т. Е. Порядок перечисления ссылок с равными значениями не может быть заранее определен), как указано Johannes Sixt ($ gmane/280117).
Следовательно, возврат к алфавитному сравнению, основанный на имени, когда другой критерий равен.
$ 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) Самуэлем Мафтулом ('').
(Слияние с Юнио С Хамано - gitster
- в совершении d89db6f, 27 августа 2018 года)
branch.sort:
Эта переменная управляет упорядочением сортировки ветвей при отображении git-branch
.
Без --sort=<value>
" --sort=<value>
" значение этой переменной будет использоваться по умолчанию.
Чтобы указать удаленные ветки, используйте git branch -r --sort=objectsize
. Флаг -r
заставляет его -r
удаленные ветки вместо локальных ветвей.
Ответ 10
Мне нравится использовать относительную дату и сокращать название ветки следующим образом:
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)$|$"
Ответ 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"
Ответ 12
Начиная с Git 2.19 вы можете просто:
git branch --sort=-committerdate
Вы также можете:
git config branch.sort -committerdate
Таким образом, всякий раз, когда вы перечисляете ветки в текущем репозитории, они будут перечислены отсортированными по committerdate.
Если всякий раз, когда вы перечисляете ветки, вы хотите, чтобы они сортировались по comitterdate:
git config --global branch.sort -committerdate
Отказ от ответственности: я являюсь автором этой функции в Git, и я реализовал ее, когда увидел этот вопрос.
Ответ 13
У меня была та же проблема, поэтому я написал жемчужину Ruby под названием 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
Он также позволяет сохранять пользовательские свойства для каждой ветки, например идентификатор билета, статус, todos и фильтровать список ветвей в соответствии с этими свойствами. Дополнительная информация: http://rondevera.github.io/twig/
Ответ 14
Я придумал следующую команду (для 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
Я написал сообщение в блоге о том, как работают разные произведения.
Ответ 15
К вашему сведению, если вы хотите получить список недавно проверенных веток (в отличие от недавно добавленных), вы можете использовать Git reflog:
$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything
См. также: Как получить список веток Git, которые я недавно проверил?
Ответ 16
Вот еще один скрипт, который делает то же, что и все остальные скрипты. На самом деле, он предоставляет функцию для вашей оболочки.
Его вклад заключается в том, что он вытягивает некоторые цвета из вашей конфигурации 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}"
}
Ответ 17
Вот небольшой скрипт, который я использую для переключения между недавними ветками:
#!/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) и число в каждой. Введите номер ветки, и он проверяется:
Ответ 18
Это основано на версии 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
Ответ 19
Обычно мы рассматриваем удаленные ветки в последнее время. Так что попробуйте это
git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin
Ответ 20
Мой лучший результат как script:
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
Ответ 21
git branch --sort=-committerdate | head -5
Для любого, кто заинтересован в том, чтобы отсортировать только топ-5 названий веток на основе даты коммиттера.
Ответ 22
Здесь вариация, которую я искал:
git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r
Это tail -r
отменяет список, поэтому последний commiterdate
является последним.
Ответ 23
Принятый ответ командной строки ошеломляет, но если вы хотите что-то более красивое, например графический интерфейс, и ваше происхождение === "github".
Вы можете нажать "Филиалы" в репозитории. Или нажмите на ссылку напрямую: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches
Ответ 24
Я вывожу вывод из принятого ответа в 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
.
Ответ 25
Я знаю, что ответов уже много, но вот мои два цента за простой псевдоним (мне нравится, когда моя последняя ветка внизу):
[alias]
br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
current = yellow
local = cyan
remote = red
Это даст вам хороший обзор ваших последних 15 цветных веток, с выделенной текущей веткой (она помечена звездочкой).
Ответ 26
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))'
это то, что вам нужно
Ответ 27
Git v2.19 представляет branch.sort
конфигурации 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