git 2.7 (Q4 2015) introdurrà l'ordinamento delle filiali usando direttamente git branch
:
vedi commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 set 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 set 2015) e commit f65f139 , ... (23 set 2015) di Karthik Nayak ( KarthikNayak
) .
(Unita da Junio C Hamano - gitster
- in commit 7f11b48 , 15 ott 2015)
In particolare, commetti aedcb7d :
branch.c
: usa ' ref-filter
' API
Fai ' branch.c
' usa 'ref-filter
API ' per iterare attraverso l'ordinamento dei riferimenti. Ciò rimuove la maggior parte del codice utilizzato in branch.c
"sostituendolo con le chiamate al"ref-filter
"libreria.
Si aggiunge l'opzione--sort=<key>
:
Ordina in base alla chiave fornita.
Prefisso-
per ordinare in ordine decrescente del valore.
È possibile utilizzare il --sort=<key>
più volte opzione, nel qual caso l'ultima chiave diventa la chiave primaria.
Le chiavi supportate sono le stesse di quelle ingit for-each-ref
.
L'ordinamento predefinito è l'ordinamento basato sul nome di riferimento completo (incluso refs/...
prefisso). Questo elenca prima HEAD (se presente) staccato, quindi le filiali locali e infine le filiali di tracciamento remoto.
Qui:
git branch --sort=-committerdate
Oppure (vedi sotto 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
Vedi anche commit 9e46833 (30 ott 2015) di Karthik Nayak ( KarthikNayak
) .
Aiutato da: Junio C Hamano ( gitster
) .
(Unito da Junio C Hamano - gitster
- in commit 415095f , 03 nov 2015)
Quando si ordina secondo i valori numerici (ad es. --sort=objectsize
) Non esiste un confronto di fallback quando entrambi i ref mantengono lo stesso valore. Ciò può causare risultati imprevisti (cioè l'ordine di elencare i ref con valori uguali non può essere predeterminato) come sottolineato da Johannes Sixt ( $ gmane / 280117 ).
Quindi, il ritorno al confronto alfabetico basato sul refname ogni volta che l'altro criterio è uguale .
$ git branch --sort=objectsize
* (HEAD detached from fromtag)
branch-two
branch-one
master
Con Git 2.19, l'ordinamento può essere impostato per impostazione predefinita.
git branch
supporta una configurazione branch.sort
, come git tag
, che aveva già una configurazione tag.sort
.
Vedi commit 560ae1c (16 ago 2018) di Samuel Maftoul (``) .
(Unito da Junio C Hamano - gitster
- in commit d89db6f , 27 ago 2018)
branch.sort:
Questa variabile controlla l'ordinamento dei rami quando viene visualizzato da git-branch
.
Senza l' --sort=<value>
opzione " " fornita, il valore di questa variabile verrà utilizzato come predefinito.
Per elencare i rami remoti, utilizzare git branch -r --sort=objectsize
. Il-r
flag fa sì che elenca i rami remoti invece dei rami locali.
Con Git 2.27 (Q2 2020), le varianti " git branch
" e altre " for-each-ref
" hanno accettato più --sort=<key>
opzioni nel crescente ordine di precedenza, ma hanno avuto alcune rotture "--ignore-case
gestione " e nel legame con il nome di riferimento, che sono stati corretti.
Vedi commit 7c5045f , commit 76f9e56 (03 maggio 2020) di Jeff King ( peff
) .
(Unita da Junio C Hamano - gitster
- in commit 6de1630 , 08 maggio 2020)
ref-filter
: applica l'ordinamento refname di fallback solo dopo tutti gli ordinamenti dell'utente
Firmato-fuori-da: Jeff King
Commit 9e468334b4 (" ref-filter
: fallback sul confronto alfabetico", 30-10-2015, Git v2.7.0-rc0 - unione elencata nel batch # 10 ) ha insegnato l'ordinamento di ref-filter al fallback per confrontare i nomi di ref.
Ma lo ha fatto al livello sbagliato, sovrascrivendo il risultato del confronto per un singolo "--sort
chiave " da parte dell'utente, piuttosto che dopo che tutte le chiavi di ordinamento sono state esaurite.
Funzionava correttamente per una " --sort
" opzione, ma non per più.
Rompiamo i legami nella prima chiave con il refname e non valutiamo mai la seconda chiave.
Per rendere le cose ancora più interessanti, abbiamo applicato questo fallback solo a volte!
Per un campo come " taggeremail
" che richiede un confronto di stringhe, restituiremmo veramente il risultato strcmp()
, anche se fosse 0.
Ma per " value
" campi numerici come " taggerdate
", abbiamo applicato il fallback. Ed è per questo che il nostro test multi-sort ha mancato questo: usa taggeremail
come confronto principale.
Quindi iniziamo aggiungendo un test molto più rigoroso. Avremo una serie di commit che esprimono ogni combinazione di due email tagger, date e nomi di nomi. Quindi possiamo confermare che il nostro ordinamento viene applicato con la precedenza corretta e colpiremo entrambi i comparatori di stringhe e valori.
Ciò mostra il bug e la correzione è semplice: compare_refs()
dopo tutto, spostare il fallback sulla funzione esternaref_sorting
tasti sono stati esauriti.
Nota che nella funzione esterna non abbiamo un "ignore_case"
flag, poiché fa parte di ogni singolo ref_sorting
elemento. È discutibile cosa dovrebbe fare un simile fallback, dal momento che non abbiamo usato le chiavi dell'utente per abbinare.
Ma fino ad ora abbiamo cercato di rispettare quella bandiera, quindi la cosa meno invasiva è cercare di continuare a farlo.
Poiché tutti i chiamanti nel codice corrente impostano il flag per tutti i tasti o per nessuno, possiamo semplicemente estrarre il flag dal primo tasto. In un mondo ipotetico in cui l'utente può davvero capovolgere la distinzione tra maiuscole e minuscole dei tasti separatamente, potremmo voler estendere il codice per distinguere quel caso da una coperta " --ignore-case
".