git 2.7 (Q4 2015) introducirá la clasificación de sucursales usando directamente git branch
:
ver commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 sep 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 sep 2015), y commit f65f139 , ... (23 sep 2015) por Karthik Nayak ( KarthikNayak
) .
(Fusionada por Junio C Hamano - gitster
- en commit 7f11b48 , 15 oct 2015)
En particular, comete aedcb7d :
branch.c
: use ' ref-filter
' API
Haga API de branch.c
"uso" ref-filter
para iterar a través de la clasificación de referencias. Esto elimina la mayor parte del código utilizado en ' branch.c
' reemplazándolo con llamadas a la ref-filter
biblioteca ' '.
Se añade la opción--sort=<key>
:
Ordenar según la clave dada.
Prefijo -
para ordenar en orden descendente del valor.
Puede usar la --sort=<key>
opción varias veces, en cuyo caso la última clave se convierte en la clave principal.
Las teclas admitidas son las mismas que las degit for-each-ref
.
El orden de clasificación predeterminado es la clasificación basada en el nombre de referencia completo (incluido el refs/...
prefijo). Esto enumera HEAD separado (si está presente) primero, luego ramas locales y finalmente ramas de seguimiento remoto.
Aquí:
git branch --sort=-committerdate
O (ver más abajo con Git 2.19)
# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch
Ver 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
- en commit 415095f , 03 nov 2015)
Al ordenar según los valores numéricos (p --sort=objectsize
. Ej. ) No hay comparación de respaldo cuando ambas referencias tienen el mismo valor. Esto puede causar resultados inesperados (es decir, el orden de enumerar las referencias con valores iguales no se puede predeterminar) como lo señala Johannes Sixt ( $ gmane / 280117 ).
Por lo tanto, recurra 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
Con Git 2.19, el orden de clasificación se puede establecer de forma predeterminada.
git branch
admite una configuración branch.sort
, como git tag
, que ya tenía una configuración tag.sort
.
Ver commit 560ae1c (16 de agosto de 2018) por Samuel Maftoul (``) .
(Fusionada por Junio C Hamano - gitster
- en commit d89db6f , 27 de agosto de 2018)
branch.sort:
Esta variable controla el orden de clasificación de las ramas cuando se muestra por git-branch
.
Sin la --sort=<value>
opción " " provista, el valor de esta variable se usará como predeterminado.
Para enumerar ramas remotas, use git branch -r --sort=objectsize
. La -r
bandera hace que enumere ramas remotas en lugar de ramas locales.
Con Git 2.27 (Q2 2020), " git branch
" y otras " for-each-ref
" variantes aceptaron múltiples --sort=<key>
opciones en el creciente orden de precedencia, pero tuvo algunas interrupciones "--ignore-case
" manejo y el desempate con el nombre de referencia, que se han solucionado.
Ver commit 7c5045f , commit 76f9e56 (03 de mayo de 2020) por Jeff King ( peff
) .
(Fusionada por Junio C Hamano - gitster
- en commit 6de1630 , 08 de mayo de 2020)
ref-filter
: aplique el orden de cambio de nombre de reserva solo después de todo tipo de usuarios
Firmado por: Jeff King
Commit 9e468334b4 (" ref-filter
: retroceso en la comparación alfabética", 30/10/2015, Git v2.7.0-rc0 - fusión enumerada en el lote # 10 ) enseñó el tipo de filtro de ref para recurrir a la comparación de nombres de referencia.
Pero lo hizo en el nivel incorrecto, anulando el resultado de la comparación para una sola " --sort
" clave del usuario, en lugar de después de que todas las claves de clasificación se hayan agotado.
Esto funcionó correctamente para una sola " --sort
" opción, pero no para varias.
Romperíamos cualquier vínculo en la primera clave con el nombre de referencia y nunca evaluaríamos la segunda clave.
Para hacer las cosas aún más interesantes, ¡solo aplicamos este retroceso a veces!
Para un campo como " taggeremail
" que requiere una comparación de cadenas, realmente devolveríamos el resultado de strcmp()
, incluso si fuera 0.
Pero para " value
" campos como " taggerdate
" numéricos , aplicamos el respaldo. Y es por eso que nuestra prueba de clasificación múltiple se perdió esto: se utiliza taggeremail
como la comparación principal.
Entonces, comencemos agregando una prueba mucho más rigurosa. Tendremos un conjunto de confirmaciones que expresan cada combinación de dos correos electrónicos, fechas y nombres de referencia. Luego podemos confirmar que nuestro orden se aplica con la precedencia correcta, y estaremos golpeando tanto la cadena como los comparadores de valores.
Eso muestra el error, y la solución es simple: compare_refs()
después de todo, mover el respaldo a la función externa .ref_sorting
teclas se hayan agotado.
Tenga en cuenta que en la función externa no tenemos una "ignore_case"
bandera, ya que es parte de cada ref_sorting
elemento individual . Es discutible lo que debería hacer tal respaldo, ya que no utilizamos las claves del usuario para que coincidan.
Pero hasta ahora hemos estado tratando de respetar esa bandera, por lo que lo menos invasivo es tratar de seguir haciéndolo.
Dado que todas las personas que llaman en el código actual establecen la bandera para todas las teclas o ninguna, podemos simplemente extraer la bandera de la primera tecla. En un mundo hipotético donde el usuario realmente puede voltear la mayúsculas y minúsculas de las teclas por separado, es posible que queramos extender el código para distinguir ese caso de una " --ignore-case
" mantilla .