Jak mogę uzyskać listę oddziałów Git, uporządkowaną według ostatniego zatwierdzenia?

1322

Chcę uzyskać listę wszystkich gałęzi w repozytorium Git z „najświeższymi” gałęziami na górze, gdzie „najświeższa” gałąź jest tą, do której ostatnio zobowiązano się (i dlatego jest bardziej prawdopodobne, że będzie jedną Chcę zwrócić uwagę).

Czy istnieje sposób, w jaki mogę użyć Git, aby (a) posortować listę rozgałęzień według ostatniego zatwierdzenia lub (b) uzyskać listę rozgałęzień wraz z datą ostatniego zatwierdzenia w jakimś formacie do odczytu maszynowego?

W najgorszym przypadku zawsze mogłem uruchomić, git branchaby uzyskać listę wszystkich gałęzi, przeanalizować dane wyjściowe, a następnie git log -n 1 branchname --format=format:%cidla każdego z nich, aby uzyskać datę zatwierdzenia każdej gałęzi. Będzie to jednak działało na komputerze z systemem Windows, gdzie rozpędzenie nowego procesu jest stosunkowo drogie, więc uruchomienie pliku wykonywalnego Git raz na gałąź może zwolnić, jeśli jest dużo gałęzi. Czy istnieje sposób, aby to wszystko zrobić za pomocą jednego polecenia?

Joe White
źródło
2
stackoverflow.com/a/2514279/1804124 Ma lepszą odpowiedź.
Spundun,
12
@Spundun, zgubiłeś mnie tam. W jaki sposób kombinacja wielu poleceń, w tym przepuszczanych przez Perla i sed, jest „lepsza” niż użycie polecenia, które Git już ma?
Joe White
36
@Spundun odnośnie odpowiedzi git for-each-refod Jakuba Narębskiego: możesz dostać zdalne gałęzie refs/remotes/zamiast refs/heads/(lub możesz przekazać oba, oddzielone spacjami); refs/tags/dla tagów lub tylko refs/dla wszystkich trzech rodzajów.
jakub.g
4
Począwszy od git 2.7 (IV kwartał 2015), nie więcej for-each-ref! git branch --sort=-committerdate
Użyjesz
1
Prawdopodobnie duplikat stackoverflow.com/questions/9236219/…
Ondra Žižka

Odpowiedzi:

1873

Skorzystaj z --sort=-committerdateopcji git for-each-ref;

Dostępne również od wersji Git 2.7.0 dla git branch:

Podstawowe użycie:

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

Wynik:

Wynik

Zaawansowane użycie:

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

Wynik:

Wynik

Jakub Narębski
źródło
15
Doskonały! Mogę nawet ograniczyć dane wyjściowe do samych nazw referencyjnych, dodając je --format=%(refname).
Joe White
35
To jest dla mnie lepsze:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu
2
@ilius: dlaczego nie użyć :shortname?
Jakub Narębski
37
@ilius: Jak @BeauSmith napisał: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. git-for-each-ref (1) manpage mówi: Dla niejednoznacznej krótkiej nazwy odwołania ref :short.
Jakub Narębski
76
To jest wersja pokolorowana, w tym skróty, wiadomości, uporządkowane rosnąco według daty zatwierdzenia, wraz ze względnym wiekiem ostatniego zatwierdzenia w każdej gałęzi. Ukradłem wam wszystkie powyższe pomysły. Jest w mojej .gitconfig w [alias]sekcji i uwielbiam to. br = 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))'
Michael Percy
124

Lista nazw gałęzi Git, uporządkowanych według najnowszych zmian…

Rozwijając odpowiedź Jakuba i wskazówkę Joe , następujące elementy usuwają „refs / heads /”, więc w wyniku wyświetlane są tylko nazwy gałęzi:


Komenda:

git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'

Wynik:

Najnowsze oddziały Git

Beau Smith
źródło
4
Możesz także użyć --format=%(refname:short)zamiast polegać na cut.
Chaitanya Gupta
3
Czy można to zrobić w przypadku repozytorium REMOTE?
Allan Bowe
10
aah - @ jakub.g już wyjaśniono: możesz uzyskać zdalne gałęzie przekazujące referencje / piloty / zamiast referencji / głowy /. Doskonały!!
Allan Bowe
Podoba mi się ten, jeśli próbujesz go pseudonimem, co zrobiłem, aby git rbpamiętać o otaczaniu polecenia cytatami:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
Michael Discenza
2
A teraz możesz to zrobić za pomocą git branch, więc pobieranie lokalnych, zdalnych lub wszystkich gałęzi działa jak na git-branch (tj. -R, -a). git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
phord
89

Oto optymalny kod, który łączy dwie pozostałe odpowiedzi:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
nikolay
źródło
10
Nawet trochę zoptymalizowany, aby uzyskać tabelaryczny wynik:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi
2
z jakiegoś powodu musiałem używać podwójnych cudzysłowów w
systemie
1
@schoetbi Ten kod wygląda dokładnie tak, jak ten z Nikolay. Co zmieniłeś, żeby był tabelaryczny?
Enrico
@Enrico i inni, którzy mogą zastanawiać się nad tym samym. nikolay zmienił odpowiedź, używając sugestii schoetbis. Przesuwając najpierw datę o zawsze tej samej długości, wynik wydaje się bardziej tabelaryczny.
Johnny
83

Oto proste polecenie, które wyświetla listę wszystkich gałęzi z najnowszymi zatwierdzeniami:

git branch -v

Aby zamówić według ostatniego zatwierdzenia, użyj

git branch -v --sort=committerdate

Źródło: http://git-scm.com/book/en/Git-Branching-Branch-Management

użytkownik1682406
źródło
11
git branch -avjeśli chcesz zobaczyć również oddziały nielokalne.
Scott Stafford,
34
Nie sortuje się według daty zatwierdzenia zgodnie z pytaniem.
Cas
1
Czy łatwo jest git branch -vpodać datę każdego zatwierdzenia na liście?
dumbledad
1
co powiesz na <pre> git branch -v --sort = committerdate </pre>?
iraj jelodari
2
To jest niesamowite. Lubię git branch -va --sort=-committerdatepokazywać oddziały nielokalne, z ostatnimi zmianami na górze.
Clinton Blackmore,
61

Używam następującego aliasu:

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"

który produkuje:

Wynik

Użyj „|” oddzielić.

dimid
źródło
1
Świetny alias! Sugerowałbym column -ts'|'i wstawiał znaki, jeśli znak przecinka może wystąpić w relatywnych znacznikach czasu w twoim języku.
Björn Lindqvist,
1
świetny pseudonim, dziękuję bardzo. czy możesz to ulepszyć, aby pokazać bieżącą gałąź innym kolorem lub * na początku?
elhadi dp ıpɐɥ ן ǝ
2
Przynajmniej w najnowszej wersji git można po prostu dodać '%(HEAD) ...'na początku łańcucha formatu, aby uzyskać ten sam efekt bez przeskakiwania sedpolecenia
Joshua Skrzypek
5
Nie mogłem tego zrobić jako aliasu git. Musiałem użyć[alias] recent = !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'|'
Wesley Smith
11
Musiałem dodać --color = zawsze, aby uzyskać kolor. 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)' --color=always|column -ts'|'}
user3342930,
40

Odniosłem się do poprzednich przykładów, aby stworzyć coś, co najlepiej dla mnie działa.

git for-each-ref --sort = -committerdate refs / heads / --format = '% (autor: krótki)% (kolor: czerwony)% (nazwa obiektu: krótki)% (kolor: żółty)% (zmiana nazwy: krótki )% (kolor: reset) (% (kolor: zielony)% (data zapisu: względna)% (kolor: reset)) ”

Zrzut ekranu wyjścia

Andy
źródło
1
To wygląda ładniej, bardziej kolorowo niż przy użyciu bezpośrednio gałęzi git, jak zasugerowałem w stackoverflow.com/a/33163401/6309 . +1
VonC
2
Ten działał dla mnie od razu po wyjęciu z pudełka, w przeciwieństwie do niektórych innych, więc głosowałem za nim.
Casey
1
Działało tak, jak jest naprawdę ładnie! Dzięki! :-)
FrozenTarzan
1
Ditto - ten działał już po wyjęciu z pudełka, w przeciwieństwie do wielu innych, które właśnie wypróbowałem. Dzięki.
Dan Nissenbaum,
2
Ten jest czysty i schludny. Kiedyś dodam nazwę zdalnego i autora jako: git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
ywu
38

Potrzebowałem też kolorów, tagów i zdalnych odnośników bez żadnych duplikatów:

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

Ponieważ cytowanie może być trudne, oto alias 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'"]++'"
estani
źródło
$ <twoje polecenie tutaj> awk: błąd składni przy linii 1 awk: ratowanie przy linii 1
Jamie Mason
@GotNoSugarBaby Używasz pojedynczych cudzysłowów jak w przykładzie, prawda? jakiej powłoki używasz? Bash nadaje temu charakterowi specjalne znaczenie.
estani
hej, uruchomiłem to na / bin / bash (GNU bash, wersja 4.0.28 (1) -release (i386-pc-solaris2.11)) z prostą kopią i wklejeniem twojego przykładu - ale od tego czasu uruchomiłem działa na / bin / bash (GNU bash, wersja 3.2.48 (1) -release (x86_64-apple-darwin12)) i działa, więc usunę głosowanie negatywne. Wielkie dzięki Estani.
Jamie Mason,
@GotNoSugarBaby Używam wersji 4.2.25 (1) (x86_64-pc-linux-gnu) i wypróbowałem na 3.x i działałem. Nie jestem pewien, jaki to był problem ... ale mógł mieć problem związany z wersją git, zamiast bash. W każdym razie cieszę się, że to działa dla Ciebie!
estani
1
@MichaelDiscenza po prostu potokuj wszystko do głowy. to byłoby dodać | head -n20na końcu. Jeśli używasz aliasu, upewnij się, że mieści się on w cudzysłowie.
estani
24

Inne odpowiedzi wydają się nie pozwalać na przekazywanie w -vvcelu uzyskania pełnego wyniku.

Oto jeden linijka sortująca git branch -vvwedług daty zatwierdzenia, zachowująca kolor itp .:

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

Jeśli dodatkowo chcesz wydrukować datę zatwierdzenia, możesz zamiast tego użyć tej wersji:

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-

Przykładowe dane wyjściowe:

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

Prawdopodobnie jest bardziej czytelny, podzielony na wiele wierszy:

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-

Powinno to również współpracować z innymi argumentami git branch, np. W -vvrcelu wyświetlenia gałęzi zdalnego śledzenia lub -vvalisty zarówno zdalnego śledzenia, jak i gałęzi lokalnych.

John Mellor
źródło
-vvmoże być przydatna, dzięki. Jednak to rozwiązanie wciąż powoduje pojawienie się nowych procesów dla każdej gałęzi, których PO chciał uniknąć.
musiphil
W rzeczywistości git branchnie definiuje dokładnie znaczenia -vv, ale tylko -v, więc -vvpowinien mieć to samo co -v.
musiphil
2
To jest najlepszy. Dodanie -avv powoduje, że uwzględnia również zdalne gałęzie. Dzięki za to!
Gopherkhan
@musiphil Moja strona podręcznika oddziału git-v, -vv, --verbose zawiera następujące If given twice, print the name of the upstream branch, as well
sekcje
@Perleone: Nie wiem, skąd mam te informacje, ale masz rację i poprawiam się. Dzięki!
musiphil
23

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-filterinterfejsó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.czastępowania go wywołaniami ref-filterbiblioteki „ ”.

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 branchobsł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. -rFlaga 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-caseprzerw 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 --sortklucza od użytkownika, zamiast po wyczerpaniu wszystkich kluczy sortowania.

Działa to poprawnie dla pojedynczej --sortopcji „ ”, 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 valuepól „ taggerdate” takich jak „ ” zastosowaliśmy awarię. I dlatego nasz test wielokrotnego sortowania tego nie zauważył: używa taggeremailjako 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_sortingwyczerpaniu wszystkich klawiszy.

Zauważ, że w funkcji zewnętrznej nie mamy "ignore_case"flagi, ponieważ jest ona częścią każdego ref_sortingelementu. 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”.

VonC
źródło
Aby wyświetlić listę pilotów z tą opcją, dodaj-r
Troy Daniels
@TroyDaniels uzgodnione. Możesz edytować odpowiedź. Sprawdzę twoją edycję.
VonC
19

Lubię używać daty względnej i skracać nazwę oddziału w następujący sposób:

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads

Co daje wynik:

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

Zalecam utworzenie pliku Bash do dodania wszystkich ulubionych aliasów, a następnie udostępnienia skryptu zespołowi. Oto przykład, aby dodać tylko ten:

#!/bin/sh

git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"

Następnie możesz to zrobić, aby uzyskać ładnie sformatowaną i posortowaną listę lokalnych oddziałów:

git branches

Aktualizacja: Zrób to, jeśli chcesz kolorować:

#!/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)$|$"
n8tr
źródło
To daje mifatal: unknown field name: '-authordate:iso8601'
Factor Mystic
1
Fantazyjne kolorowe wydruki są fantazyjne, ale jest to proste i właśnie tego szukałem. Wymień refs/headssię refs/remotesaby spojrzeć na zdalnych oddziałów.
Lambart
Samo polecenie jest piękne, ale alias zgłasza błąd:expansion of alias 'branches' failed; 'echo' is not a git command
Philip Kahn
Pracuje dla mnie. Co się stanie, jeśli skopiujesz to wklejając do terminala? (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)$|$"
n8tr
17

Od wersji Git 2.19 możesz po prostu:

git branch --sort=-committerdate

Możesz też:

git config branch.sort -committerdate

Dlatego za każdym razem, gdy wyświetlasz listę oddziałów w bieżącym repozytorium, zostanie ono wyświetlone na liście posortowane według daty committerdate.

Jeśli za każdym razem, gdy wyświetlasz listę oddziałów, chcesz je posortować według daty comitterdate:

git config --global branch.sort -committerdate

Oświadczenie: Jestem autorem tej funkcji w Git i zaimplementowałem ją, gdy zobaczyłem to pytanie.

użytkownik801247
źródło
2
Najbardziej aktualna odpowiedź, o wiele łatwiejsza niż stosowanie skomplikowanych skryptów lub aliasów 👌
mtefi
Używaj ostrożnie! Uważajcie wszyscy, to nie jest polecenie, aby wyświetlić listę oddziałów. Jest to polecenie zmiany konfiguracji Gita i będzie miało trwałe globalne reperkusje.
Jazimov
1
@Jazimov masz rację, zredagowałem odpowiedź, więc jest jaśniejsza
user801247
11

Dodaje trochę koloru (ponieważ pretty-formatnie jest dostępny)

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"
epylinkn
źródło
9

Miałem ten sam problem, więc napisałem rubinowy klejnot o nazwie Twig . Wyświetla listę gałęzi w kolejności chronologicznej (najpierw najnowsze), a także może pozwolić Ci ustawić maksymalny wiek, aby nie wyświetlać wszystkich gałęzi (jeśli masz ich dużo). Na przykład:

$ 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

Pozwala także przechowywać niestandardowe właściwości dla każdej gałęzi, np. Identyfikator biletu, status, zadania i filtrować listę gałęzi według tych właściwości. Więcej informacji: http://rondevera.github.io/twig/

Ron DeVera
źródło
5
Ta nazwa może nie pomóc, ponieważ jestem pewien, że istnieje kilka programów o tej samej nazwie.
thoroc
8

Wymyśliłem następujące polecenie (dla Git 2.13 i nowszych):

git branch -r --sort=creatordate \
    --format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
    | grep -v ";HEAD$" \
    | column -s ";" -t

Jeśli nie masz column, możesz zastąpić ostatni wiersz

    | sed -e "s/;/\t/g"

Wygląda jak

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

Napisałem wpis na blogu o tym, jak działają różne utwory.

bdesham
źródło
Miły. +1. Wykorzystuje to, o którym git branch --sortwspomniałem w stackoverflow.com/a/33163401/6309 .
VonC
@ DanNissenbaum Upewnij się, że korzystasz z Git 2.13 (wydanego w maju 2017 r.) Lub nowszego.
bdesham,
7

Do Twojej wiadomości, jeśli chcesz uzyskać listę ostatnio wypisanych gałęzi (w przeciwieństwie do ostatnio zatwierdzonych), możesz skorzystać z dziennika logowania Git:

$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything

Zobacz także: Jak mogę uzyskać listę oddziałów Git, które ostatnio sprawdziłem?

Jordan Brough
źródło
5

Oto mały skrypt, którego używam do przełączania między nowymi gałęziami:

#!/bin/bash
# sudo bash

re='^[0-9]+$'

if [[ "$1" =~ $re ]]; then
    lines="$1"
else
    lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"

# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
    echo -n "Checkout to: "
    read index
done

branch="$( echo "$branches_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear

Korzystanie z tych dwóch aliasów:

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

Po prostu wywołaj to w repozytorium Git, a zobaczysz ostatnie N gałęzi (domyślnie 10) i liczbę obok nich. Wprowadź numer oddziału, a to sprawdzi:

Wpisz opis zdjęcia tutaj

Agus Arias
źródło
4

Zwykle ostatnio rozważamy odległe gałęzie. Więc spróbuj tego

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin
Victor Choy
źródło
4

Oto kolejny skrypt, który robi to, co robią wszystkie inne skrypty. W rzeczywistości zapewnia funkcję twojej powłoki.

Jego wkład polega na tym, że pobiera niektóre kolory z konfiguracji Git (lub używa ustawień domyślnych).

# 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}"
}
joeytwiddle
źródło
3

Jest to oparte na wersji saeedgnu , ale z obecną gałęzią pokazaną gwiazdą i kolorem, i pokazującą tylko wszystko, co nie jest opisane jako „miesiące” lub „lata” temu:

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
Mark Lodato
źródło
2

Mój najlepszy wynik jako skrypt:

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
saeedgnu
źródło
1
Jaki rodzaj skryptu? Grzmotnąć?
Peter Mortensen
2

git branch --sort=-committerdate | head -5

Dla każdego zainteresowanego posortowaniem tylko 5 najlepszych nazw oddziałów posortowanych według daty zleceniodawcy.

nieznany błąd
źródło
1

Oto wariant, którego szukałem:

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

To tail -rodwraca listę, więc najnowsza commiterdatejest ostatnia.

Ben
źródło
3
Możesz również zmienić --sort = -committerdate na --sort = committerdate, aby to zrobić.
przeformuj
Który tailma -r?
Christoffer Hammarström
1

Przesyłam dane wyjściowe z zaakceptowanej odpowiedzi do dialog, aby uzyskać interaktywną listę:

#!/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

Zapisz jako (np.) ~/bin/git_recent_branches.shI chmod +xto. Następnie, git config --global alias.rb '!git_recent_branches.sh'aby dać mi nowe git rbpolecenie.

John Delaney
źródło
1

Wiem, że jest już wiele odpowiedzi, ale oto moje dwa centy za prosty alias (lubię mieć mój najnowszy oddział na dole):

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

To da ci ładny przegląd twoich ostatnich 15 oddziałów, w kolorze, z podświetloną bieżącą gałęzią (i ma gwiazdkę).

Tomek
źródło
1

Podczas próby ustawienia aliasu wystąpiły problemy z obsługą pojedynczych cudzysłowów na komputerze Mac w bash_profile. Ta odpowiedź pomogła rozwiązać: „ Jak uniknąć pojedynczych cudzysłowów w ciągach pojedynczych cudzysłowów

Rozwiązanie robocze:

alias gb='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))'"'"''

PS Nie mogłem skomentować z powodu mojej reputacji

Aditya Kadam
źródło
0

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))' to jest to, czego potrzebujesz

ChunkCoder
źródło
0

Git v2.19 wprowadza branch.sortopcję konfiguracji (patrz branch.sort ).

Więc git branchdomyślnie sortuje według daty zleceniodawcy (desc)

# gitconfig
[branch]
    sort = -committerdate     # desc

scenariusz:

$ git config --global branch.sort -committerdate

Aktualizacja:

Więc,

$ git branch
* dev
  master
  _

i

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
POMOC
źródło