que - git remove tag
¿Cómo puedo obtener una lista de las sucursales de git, ordenadas por la confirmación más reciente? (24)
Lista de nombres de sucursales de git, ordenados por el compromiso más reciente ...
Ampliando la respuesta de Jakub y la sugerencia de Joe, lo siguiente eliminará "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:
Quiero obtener una lista de todas las sucursales en un repositorio de Git con las sucursales "más recientes" en la parte superior, donde la sucursal "más reciente" es la que se ha comprometido más recientemente (y, por lo tanto, es más probable que sea una. Quiero prestar atención a).
¿Hay alguna manera de utilizar Git para (a) ordenar la lista de sucursales por el último compromiso, o (b) obtener una lista de las sucursales junto con la fecha de último compromiso de cada uno, en algún tipo de formato legible por máquina?
En el peor de los casos, siempre podría ejecutar git branch
para obtener una lista de todas las sucursales, analizar su salida y luego git log -n 1 branchname --format=format:%ci
para cada una, para obtener la fecha de confirmación de cada sucursal. Pero esto se ejecutará en un cuadro de Windows, donde un nuevo proceso es relativamente costoso, por lo que el lanzamiento del ejecutable git una vez por rama podría ser lento si hay muchas sucursales. ¿Hay una manera de hacer todo esto con un solo comando?
A partir de git 2.19 puede simplemente:
git config --global branch.sort -committerdate
Por lo tanto, siempre que enumere las ramas, se ordenará ordenado por fecha de envío.
Descargo de responsabilidad: Soy el autor de esta función en git, la implementé cuando vi esta pregunta.
Agrega un poco de color (ya que pretty-format
no está disponible)
[alias]
branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"
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)''
Aquí está la variación que estaba buscando:
git for-each-ref --sort=-committerdate --format=''%(committerdate)%09%(refname:short)'' refs/heads/ | tail -r
Esa tail -r
invierte la lista, por lo que la fecha más reciente de commiterdate
es la última.
Aquí hay otro script que hace lo que hacen todos los demás scripts. De hecho, proporciona una función para su shell.
Su contribución es que extrae algunos colores de su configuración de git (o usa valores predeterminados).
# 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}"
}
Aquí hay un comando simple que enumera todas las ramas con las últimas confirmaciones:
git branch -v
Para ordenar por la confirmación más reciente, use
git branch -v --sort=committerdate
Fuente: http://git-scm.com/book/en/Git-Branching-Branch-Management
Aquí hay un pequeño script que uso para cambiar entre las sucursales recientes:
#!/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
Usando esos dos alias
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)''
Simplemente llama a eso en un repositorio de git y te mostrará las últimas N sucursales (10 de forma predeterminada) y un número a cada una. Ingrese el número de la rama y verifica:
Basado en la versión de ilius, pero con la rama actual que se muestra con una estrella y en color, y que solo muestra todo lo que no se describe como hace "meses" o "años":
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
Canalizo la salida de la respuesta aceptada en un dialog
, para darme una lista interactiva:
#!/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
Guarde como (por ejemplo) ~/bin/git_recent_branches.sh
y chmod +x
it. Luego git config --global alias.rb ''!git_recent_branches.sh''
para darme un nuevo comando git rb
.
Las otras respuestas no parecen permitir que el paso -vv
obtenga una salida detallada.
Así que aquí hay una sola línea que ordena git branch -vv
por fecha de confirmación, 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 confirmación, 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-
Salida de muestra:
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 dividirlo 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
, por ejemplo, -vvr
para enumerar las sucursales de seguimiento remoto, o -vva
para enumerar las sucursales locales y de seguimiento remoto.
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 script a 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 '' ------------------------------------------------------------''"
Luego, puede hacer esto para obtener una lista de sucursales locales bien formateada y ordenada:
git branches
Actualización: haz esto si quieres 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)$|$"
Mi mejor resultado como guión:
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
Para su información, si desea obtener una lista de las sucursales retiradas recientemente (a diferencia de las confirmadas recientemente) puede usar el reflog de git:
$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk ''{ print $3 }'' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything
Ver también: ¿Cómo puedo obtener una lista de las sucursales de git que he comprobado recientemente?
Pude hacer referencia a los ejemplos anteriores para crear algo que funcione mejor para mí.
git for-each-ref --sort = -committerdate refs / heads / --format = ''% (authordate: short)% (color: red)% (objectname: short)% (color: yellow)% (refname: short )% (color: reinicio) (% (color: verde)% (fecha de envío: relativo)% (color: reinicio)) ''
Se me ocurrió el siguiente comando (para Git 2.13 y posteriores):
git branch -r --sort=creatordate /
--format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" /
| grep -v ";HEAD$" /
| column -s ";" -t
Si no tienes column
puedes reemplazar la última línea con
| sed -e "s/;//t/g"
La salida se ve como
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
Escribí un blog sobre cómo funcionan las diferentes piezas.
También necesitaba colores, etiquetas y referencias remotas sin duplicados:
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]++''
Porque citar puede ser difícil, aquí el alias para 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''"]++''"
Tarde a la fiesta aquí. La respuesta CML aceptada es increíble, pero si quieres algo más bonito, como una GUI, y tu origen === "github".
Puede hacer clic en "Ramas" en el repositorio. o pulsa la url directa: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches
Tuve el mismo problema, así que escribí una gema de Ruby llamada Twig . Enumera las ramas en orden cronológico (las más nuevas primero), y también puede permitirle establecer una edad máxima para que no enumere todas las ramas (si tiene muchas). Por ejemplo:
$ 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
También le permite almacenar propiedades personalizadas para cada sucursal, por ejemplo, identificación del ticket, estado, todos y filtrar la lista de sucursales de acuerdo con estas propiedades. Más información: Twig
Use la opción --sort=-committerdate
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:
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:
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:
Edición: utilizar ''|'' para separar, gracias a @ Björn Lindqvist
Actualización: añadido * antes de la rama actual, gracias a @elhadi
Edición: se corrigió un caso donde la rama actual era una subcadena de otra rama
Edición: use una sintaxis más simple para la rama actual, gracias a @Joshua Skrzypek
git 2.7 (Q4 2015) introducirá la clasificación de sucursales utilizando directamente git branch
:
Consulte commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 de septiembre de 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 de septiembre de 2015), y commit f65f139 , ... (23 de septiembre de 2015) por Karthik Nayak ( KarthikNayak
) .
(Fusionada por Junio C Hamano - gitster
- in commit 7f11b48 , 15 de octubre de 2015)
En particular, cometer aedcb7d :
branch.c
: usa las API ''ref-filter
''
Haga que '' branch.c
'' use las API de '' ref-filter
'' para iterar a través de la clasificación de refs. Esto elimina la mayor parte del código utilizado en '' branch.c
'', reemplazándolo con llamadas a la biblioteca '' ref-filter
''.
Agrega la opción --sort=<key>
:
Ordenar basado en la clave dada.
Prefijo-
para ordenar en orden descendente del valor.Puede usar la
--sort=<key>
varias veces, en cuyo caso la última clave se convierte en la clave principal.Las claves admitidas son las mismas que las de
git for-each-ref
.
El orden de clasificación se ordena por defecto según el nombre completo de ref (incluyendo refsrefs/...
prefix). Esto enumera primero HEAD (si está presente), luego sucursales locales y finalmente sucursales remotas.
Aquí:
git branch --sort=-committerdate
Véase también commit 9e46833 (30 de octubre de 2015) por Karthik Nayak ( KarthikNayak
) .
Ayudado por: Junio C Hamano ( gitster
) .
(Fusionada por Junio C Hamano - gitster
- in commit 415095f , 03 de noviembre de 2015)
Cuando se clasifica según valores numéricos (por ejemplo,
--sort=objectsize
) no hay comparación de--sort=objectsize
cuando ambas referencias tienen el mismo valor. Esto puede causar resultados inesperados (es decir, el orden de referencia de refs con valores iguales no puede ser predeterminado) como lo señala Johannes Sixt ( $gmane/280117 ).Por lo tanto, retroceda a la comparación alfabética basada en el nombre de referencia cuando el otro criterio sea igual .
$ git branch --sort=objectsize
* (HEAD detached from fromtag)
branch-two
branch-one
master
Con Git 2.19, el orden se puede configurar de forma predeterminada.
git branch
compatible con config branch.sort
, como git tag
, que ya tenía una config tag.sort
.
Ver commit 560ae1c (16 de agosto de 2018) de Samuel Maftoul (``) .
(Combinado por Junio C Hamano - gitster
- in commit d89db6f , 27 de agosto de 2018)
branch.sort:
Esta variable controla el ordenamiento de las ramas cuando se muestra por
git-branch
.
Sin la--sort=<value>
"--sort=<value>
" provista, el valor de esta variable se usará como predeterminado.
Para listar las ramas remotas, use git branch -r --sort=objectsize
. La -r
hace que enumere las ramas remotas en lugar de las sucursales locales.
Git v2.19 introduce la opción de configuración branch.sort
(ver branch.sort ).
Así que git branch
ordenará por fecha de envío (desc) de forma predeterminada con
# gitconfig
[branch]
sort = -committerdate # desc
guión:
$ git config --global branch.sort -committerdate
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))''
esto es lo que necesita