Как я могу получить список веток Git, упорядоченный по последнему коммиту? - PullRequest
1098 голосов
/ 04 марта 2011

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

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

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

Ответы [ 27 ]

11 голосов
/ 27 января 2014

Добавляет цвет (так как 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"
10 голосов
/ 12 сентября 2018

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

git branch --sort=-committerdate

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

git config branch.sort -committerdate

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

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

git config --global branch.sort -committerdate

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

8 голосов
/ 01 августа 2017

Я придумал следующую команду (для 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

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

8 голосов
/ 08 июня 2013

У меня была такая же проблема, поэтому я написал рубиновый гем под названием 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/

7 голосов
/ 02 августа 2014

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

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

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

4 голосов
/ 09 апреля 2014

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

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

# 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 голосов
/ 30 ноября 2016

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

#!/bin/bash
# sudo bash

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

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

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

branch="$( echo "$branchs_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) и число в каждой.Введите номер филиала и он проверяется:

enter image description here

3 голосов
/ 13 августа 2013

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

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 голосов
/ 01 июля 2013

Мой лучший результат в виде скрипта:

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
2 голосов
/ 18 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...