tag remove que crear git version-control branch

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



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



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 refs refs/... 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