Pregunta ¿Cómo puedo obtener una lista de las ramas de git ordenadas por la confirmación más reciente?


Quiero obtener una lista de todas las sucursales en un repositorio Git con las ramas más "frescas" en la parte superior, donde la rama "más reciente" es la que se ha comprometido más recientemente (y, por lo tanto, es más probable que sea una Quiero prestarle atención)

¿Hay alguna forma de que pueda usar Git para (a) ordenar la lista de ramas por la confirmación más reciente, o (b) obtener una lista de ramas junto con la fecha de último compromiso de cada una, en algún tipo de formato legible por máquina?

En el peor de los casos, siempre podría correr git branch para obtener una lista de todas las ramas, analizar su salida y luego git log -n 1 branchname --format=format:%ci para cada uno, para obtener la fecha de compromiso de cada rama. Pero esto se ejecutará en una caja de Windows, donde girar un nuevo proceso es relativamente costoso, por lo que el lanzamiento del ejecutable de git una vez por rama podría ser lento si hay muchas ramas. ¿Hay alguna manera de hacer todo esto con un solo comando?


891
2018-03-04 00:26


origen


Respuestas:


Utilizar --sort=-committerdate opción de git for-each-ref;
  También disponible desde Git 2.7.0 para git branch:

Uso Básico:

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

Resultado:

result

Uso avanzado:

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))'

Resultado:

result


1220
2018-03-04 00:33



Lista de nombres de ramas git, ordenados por la confirmación más reciente ...

Ampliando la respuesta de Jakub y la sugerencia de Joe, lo siguiente eliminará los "refs / heads /", por lo que la salida solo muestra los nombres de las ramas:


Mando:

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

Resultado:

recent git branches


110
2018-05-12 01:21



Aquí está el código óptimo, que combina las otras dos respuestas:

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

74
2018-05-21 23:22



Aquí hay un comando simple que enumera todas las ramas con los últimos commits:

git branch -v

Para ordenar por la confirmación más reciente, use

git branch -v --sort=committerdate

Fuente: http://git-scm.com/book/es/Git-Branching-Branch-Management


64
2018-03-13 11:54



Yo uso el siguiente alias:

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"

que produce: result

Editar: use '|' para separar, gracias a @ Björn Lindqvist

Actualización: agregado * antes de la rama actual, gracias a @elhadi
Editar: se corrigió un caso en el que la rama actual era una subcadena de otra rama

Editar: use una sintaxis más simple para la rama actual, gracias a @Joshua Skrzypek


36
2018-05-06 12:05



También necesitaba colores, etiquetas y referencias remotas sin ningún duplicado:

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]++'

Debido a que las citas pueden ser difíciles, aquí el alias de 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'"]++'"

34
2017-08-19 09:27



Las otras respuestas no parecen permitir pasar -vv para obtener resultados detallados

Así que aquí hay una línea que ordena git branch -vv por fecha de compromiso, preservando el color, etc.

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

Si además desea imprimir la fecha de compromiso, puede usar esta versión en su lugar:

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-

Muestra de salida:

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

Probablemente sea más fácil de dividir en varias líneas:

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-

Esto también debería funcionar con otros argumentos para git branch, p.ej. -vvr para enumerar las ramas de seguimiento remoto, o -vva para enumerar tanto el seguimiento remoto como las sucursales locales.


22
2017-09-12 15:06



Me gusta usar una fecha relativa y acortar el nombre de la rama de esta manera:

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

Lo que te da salida:

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

Recomiendo hacer un archivo bash para agregar todos sus alias favoritos y luego compartir el guión con su equipo. Aquí hay un ejemplo para agregar solo este:

#!/bin/sh

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

A continuación, puede hacer esto para obtener una lista de sucursales locales bien formateada y ordenada:

git branches

Actualizar: Haga esto si quiere colorear:

#!/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)$|$"

19
2018-05-29 22:30



git 2.7 (Q4 2015) introducirá la clasificación de ramas usando directamente git branch:
Ver cometer aa3bc55, cometer aedcb7d, cometer 1511b22, cometer f65f139, ... (23 de septiembre de 2015), cometer aedcb7d, cometer 1511b22, cometer ca41799 (24 de septiembre de 2015), y cometer f65f139, ... (23 de septiembre de 2015) por Karthik Nayak (KarthikNayak).
(Fusionado por Junio ​​C Hamano - gitster - en cometer 7f11b48, 15 de octubre de 2015) 

En particular, cometer aedcb7d:

branch.c: utilizar 'ref-filter'API

Hacer 'branch.c' utilizar 'ref-filter'API para iterar a través de la ordenación de refs. Esto elimina la mayor parte del código utilizado en 'branch.c'reemplazándolo con llamadas a 'ref-filter'biblioteca.

Eso agrega la opción --sort=<key>:

Ordenar según la clave dada.
  Prefijo - para ordenar en orden descendente del valor.

Puedes usar el --sort=<key> opción varias veces, en cuyo caso la última tecla se convierte en la clave principal.

Las claves compatibles son lo mismo que aquellos en git for-each-ref.
  La orden de clasificación se predetermina a la ordenación basada en la referencia completa (incluyendo refs/... prefijo). Esto enumera el HEAD separado (si está presente) primero, luego las ramas locales y finalmente las ramas de seguimiento remoto.

Aquí:

git branch --sort=-committerdate 

Ver también cometer 9e46833 (30 de octubre de 2015) por Karthik Nayak (KarthikNayak).
Ayudado por: Junio ​​C Hamano (gitster).
(Fusionado por Junio ​​C Hamano - gitster - en cometer 415095f, 03 de noviembre de 2015) 

Al ordenar según valores numéricos (p. --sort=objectsize) no hay comparación de retroceso cuando ambos refs tienen el mismo valor. Esto puede provocar resultados inesperados (es decir, el orden de enumeración de referencias con valores iguales no puede predeterminarse), como señaló Johannes Sixt ($ gmane / 280117)

Por lo tanto, retroceso a la comparación alfabética basada en el nombre de referencia   siempre que el otro criterio sea igual.

$ git branch --sort=objectsize

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

18
2017-10-16 05:53



Pude hacer referencia a los ejemplos anteriores para crear algo que funciona mejor para mí.

git for-each-ref --sort = -committerdate refs / heads /   --format = '% (authordate: short)% (color: red)% (objectname: short)% (color: yellow)% (refname: short)% (color: reset)   (% (color: verde)% (committerdate: relative)% (color: reset)) '

Screenshot of Output


18
2018-06-13 19:09