git 2.7 (IV kwartał 2015 r.) wprowadzi sortowanie gałęzi przy użyciu bezpośrednio git branch
:
Zobacz zatwierdzenie aa3bc55 , zatwierdzenie aedcb7d , zatwierdzenie 1511b22 , zatwierdzenie f65f139 , ... (23 września 2015), zatwierdzenie aedcb7d , zatwierdzenie 1511b22 , zatwierdzenie ca41799 (24 września 2015) i commit f65f139 , ... (23 wrz 2015) autor: Karthik Nayak ( KarthikNayak
) .
(Połączone przez Junio C Hamano - gitster
- w commit 7f11b48 , 15 października 2015)
W szczególności wykonaj polecenie aedcb7d :
branch.c
: użyj ref-filter
interfejsów API
Make „ branch.c
” użycie „ ref-filter
” API dla iteracja odn sortujących. Spowoduje to usunięcie większości kodu używanego podczas branch.c
zastępowania go wywołaniami ref-filter
biblioteki „ ”.
To dodaje opcję--sort=<key>
:
Sortuj według podanego klucza.
Prefiks -
do sortowania w malejącej kolejności wartości.
Możesz użyć tej --sort=<key>
opcji wiele razy, w którym to przypadku ostatni klucz staje się kluczem podstawowym.
Obsługiwane klucze są takie same jak wgit for-each-ref
.
Domyślna kolejność sortowania to sortowanie na podstawie pełnej nazwy zmiany (w tym refs/...
prefiksu). Ta lista zawiera najpierw odłączony HEAD (jeśli jest obecny), następnie oddziały lokalne, a na końcu oddziały zdalnego śledzenia.
Tutaj:
git branch --sort=-committerdate
Lub (patrz poniżej z Git 2.19)
# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch
Zobacz także commit 9e46833 (30 października 2015) autor: Karthik Nayak ( KarthikNayak
) .
Pomagał: Junio C Hamano ( gitster
) .
(Połączone przez Junio C Hamano - gitster
- w commit 415095f , 03 listopada 2015)
Podczas sortowania według wartości liczbowych (np. --sort=objectsize
) Nie ma porównania rezerwowego, gdy oba odniesienia mają tę samą wartość. Może to powodować nieoczekiwane wyniki (tj. Kolejność umieszczania referencji z jednakowymi wartościami nie może być z góry określona), jak wskazał Johannes Sixt ( $ gmane / 280117 ).
Stąd powrót do porównania alfabetycznego na podstawie zmiany nazwy, ilekroć drugie kryterium jest równe .
$ git branch --sort=objectsize
* (HEAD detached from fromtag)
branch-two
branch-one
master
W Git 2.19 kolejność sortowania można ustawić domyślnie.
git branch
obsługuje konfigurację branch.sort
, taką jak git tag
, która już miała konfigurację tag.sort
.
Zobacz zatwierdzenie 560ae1c (16 sierpnia 2018 r.) Autor: Samuel Maftoul (``) .
(Połączone przez Junio C Hamano - gitster
- w commit d89db6f , 27 sierpnia 2018)
branch.sort:
Ta zmienna kontroluje porządek sortowania gałęzi, gdy są wyświetlane przez git-branch
.
Bez opcji „ --sort=<value>
” wartość tej zmiennej będzie używana jako domyślna.
Aby wyświetlić listę zdalnych gałęzi, użyj git branch -r --sort=objectsize
. -r
Flaga powoduje, że do listy zdalnych oddziałów zamiast lokalnych oddziałów.
W wersji Git 2.27 (Q2 2020) warianty „ git branch
” i inne „ for-each-ref
” akceptowały wiele --sort=<key>
opcji w rosnącym porządku pierwszeństwa, ale miało kilka --ignore-case
przerw w obsłudze i „remis” przy zmianie nazwy, które zostały naprawione.
Zobacz commit 7c5045f , commit 76f9e56 (03 maja 2020) autor: Jeff King ( peff
) .
(Połączone przez Junio C Hamano - gitster
- w comm 6de1630 , 08 maja 2020)
ref-filter
: zastosuj zastępczą zmianę nazwy sortuj tylko po wszystkich sortowaniach użytkowników
Podpisano: Jeff King
Commit 9e468334b4 („ ref-filter
: powrót do porównania alfabetycznego”, 30.10.2015, Git v2.7.0-rc0 - scalenie wymienione w partii nr 10 ) nauczył sortowania filtrów zwrotnych do powrotu do porównywania nazw.
Ale zrobił to na niewłaściwym poziomie, zastępując wynik porównania dla pojedynczego --sort
klucza od użytkownika, zamiast po wyczerpaniu wszystkich kluczy sortowania.
Działa to poprawnie dla pojedynczej --sort
opcji „ ”, ale nie dla wielu.
Zerwalibyśmy wszelkie powiązania pierwszego klucza z nazwą zmiany nazwy i nigdy nie ocenialiśmy drugiego klucza w ogóle.
Aby sprawy były jeszcze bardziej interesujące, stosowaliśmy tę rezerwę tylko czasami!
W przypadku pola takiego jak „ taggeremail
”, które wymaga porównania ciągów, naprawdę zwrócilibyśmy wynik strcmp()
, nawet jeśli byłby równy 0.
Ale dla liczbowych value
pól „ taggerdate
” takich jak „ ” zastosowaliśmy awarię. I dlatego nasz test wielokrotnego sortowania tego nie zauważył: używa taggeremail
jako głównego porównania.
Zacznijmy od dodania znacznie bardziej rygorystycznego testu. Będziemy mieć zestaw zatwierdzeń wyrażających każdą kombinację dwóch e-maili tagger, dat i nazw. Następnie możemy potwierdzić, że nasze sortowanie jest stosowane z prawidłowym priorytetem, i będziemy uderzać zarówno w komparator ciągu, jak i wartości.
To pokazuje błąd, a poprawka jest prosta: przeniesienie powrotu do compare_refs()
funkcji zewnętrznej po ref_sorting
wyczerpaniu wszystkich klawiszy.
Zauważ, że w funkcji zewnętrznej nie mamy "ignore_case"
flagi, ponieważ jest ona częścią każdego ref_sorting
elementu. Dyskusyjne jest, co powinna zrobić taka awaria, ponieważ nie użyliśmy kluczy użytkownika do dopasowania.
Ale do tej pory staraliśmy się uszanować tę flagę, więc najmniej inwazyjną rzeczą jest próba kontynuowania tego.
Ponieważ wszyscy dzwoniący w bieżącym kodzie albo ustawiają flagę dla wszystkich kluczy, albo dla żadnego, możemy po prostu wyciągnąć flagę z pierwszego klucza. W hipotetycznym świecie, w którym użytkownik naprawdę może osobno wyłączać rozróżnianie wielkości liter w klawiszach, możemy chcieć rozszerzyć kod, aby odróżnić tę literę od koca „ --ignore-case
”.