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 branch
aby uzyskać listę wszystkich gałęzi, przeanalizować dane wyjściowe, a następnie git log -n 1 branchname --format=format:%ci
dla 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?
źródło
git for-each-ref
od Jakuba Narębskiego: możesz dostać zdalne gałęzierefs/remotes/
zamiastrefs/heads/
(lub możesz przekazać oba, oddzielone spacjami);refs/tags/
dla tagów lub tylkorefs/
dla wszystkich trzech rodzajów.for-each-ref
!git branch --sort=-committerdate
Odpowiedzi:
Skorzystaj z
--sort=-committerdate
opcjigit for-each-ref
;Dostępne również od wersji Git 2.7.0 dla
git branch
:Podstawowe użycie:
Wynik:
Zaawansowane użycie:
Wynik:
źródło
--format=%(refname)
.git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
:shortname
?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
.[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))'
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:
Wynik:
źródło
--format=%(refname:short)
zamiast polegać nacut
.git rb
pamiętać o otaczaniu polecenia cytatami:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
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))'
Oto optymalny kod, który łączy dwie pozostałe odpowiedzi:
źródło
git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
Oto proste polecenie, które wyświetla listę wszystkich gałęzi z najnowszymi zatwierdzeniami:
Aby zamówić według ostatniego zatwierdzenia, użyj
Źródło: http://git-scm.com/book/en/Git-Branching-Branch-Management
źródło
git branch -av
jeśli chcesz zobaczyć również oddziały nielokalne.git branch -v
podać datę każdego zatwierdzenia na liście?git branch -va --sort=-committerdate
pokazywać oddziały nielokalne, z ostatnimi zmianami na górze.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:
Użyj „|” oddzielić.
źródło
column -ts'|'
i wstawiał znaki, jeśli znak przecinka może wystąpić w relatywnych znacznikach czasu w twoim języku.'%(HEAD) ...'
na początku łańcucha formatu, aby uzyskać ten sam efekt bez przeskakiwaniased
polecenia[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'|'
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'|'}
Odniosłem się do poprzednich przykładów, aby stworzyć coś, co najlepiej dla mnie działa.
źródło
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))'
Potrzebowałem też kolorów, tagów i zdalnych odnośników bez żadnych duplikatów:
Ponieważ cytowanie może być trudne, oto alias Bash:
źródło
| head -n20
na końcu. Jeśli używasz aliasu, upewnij się, że mieści się on w cudzysłowie.Inne odpowiedzi wydają się nie pozwalać na przekazywanie w
-vv
celu uzyskania pełnego wyniku.Oto jeden linijka sortująca
git branch -vv
według daty zatwierdzenia, zachowująca kolor itp .:Jeśli dodatkowo chcesz wydrukować datę zatwierdzenia, możesz zamiast tego użyć tej wersji:
Przykładowe dane wyjściowe:
Prawdopodobnie jest bardziej czytelny, podzielony na wiele wierszy:
Powinno to również współpracować z innymi argumentami
git branch
, np. W-vvr
celu wyświetlenia gałęzi zdalnego śledzenia lub-vva
listy zarówno zdalnego śledzenia, jak i gałęzi lokalnych.źródło
-vv
moż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ąć.git branch
nie definiuje dokładnie znaczenia-vv
, ale tylko-v
, więc-vv
powinien mieć to samo co-v
.-v, -vv, --verbose
zawiera następująceIf given twice, print the name of the upstream branch, as well
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 :
Make „
branch.c
” użycie „ref-filter
” API dla iteracja odn sortujących. Spowoduje to usunięcie większości kodu używanego podczasbranch.c
zastępowania go wywołaniamiref-filter
biblioteki „ ”.To dodaje opcję
--sort=<key>
:Tutaj:
Lub (patrz poniżej z Git 2.19)
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)W Git 2.19 kolejność sortowania można ustawić domyślnie.
git branch
obsługuje konfiguracjębranch.sort
, taką jakgit 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)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)źródło
-r
Lubię używać daty względnej i skracać nazwę oddziału w następujący sposób:
Co daje wynik:
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:
Następnie możesz to zrobić, aby uzyskać ładnie sformatowaną i posortowaną listę lokalnych oddziałów:
Aktualizacja: Zrób to, jeśli chcesz kolorować:
źródło
fatal: unknown field name: '-authordate:iso8601'
refs/heads
sięrefs/remotes
aby spojrzeć na zdalnych oddziałów.expansion of alias 'branches' failed; 'echo' is not a git command
(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)$|$"
Od wersji Git 2.19 możesz po prostu:
Możesz też:
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:
Oświadczenie: Jestem autorem tej funkcji w Git i zaimplementowałem ją, gdy zobaczyłem to pytanie.
źródło
Dodaje trochę koloru (ponieważ
pretty-format
nie jest dostępny)źródło
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:
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/
źródło
Wymyśliłem następujące polecenie (dla Git 2.13 i nowszych):
Jeśli nie masz
column
, możesz zastąpić ostatni wierszWygląda jak
Napisałem wpis na blogu o tym, jak działają różne utwory.
źródło
git branch --sort
wspomniałem w stackoverflow.com/a/33163401/6309 .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:
Zobacz także: Jak mogę uzyskać listę oddziałów Git, które ostatnio sprawdziłem?
źródło
Oto mały skrypt, którego używam do przełączania między nowymi gałęziami:
Korzystanie z tych dwóch aliasów:
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:
źródło
Zwykle ostatnio rozważamy odległe gałęzie. Więc spróbuj tego
źródło
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).
źródło
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:
źródło
Mój najlepszy wynik jako skrypt:
źródło
git branch --sort=-committerdate | head -5
Dla każdego zainteresowanego posortowaniem tylko 5 najlepszych nazw oddziałów posortowanych według daty zleceniodawcy.
źródło
Akceptowana odpowiedź z wiersza poleceń zachwiała się, ale jeśli chcesz czegoś ładniejszego, takiego jak GUI, a twoje pochodzenie === "github".
Możesz kliknąć „Oddziały” w repozytorium. Lub kliknij adres URL bezpośrednio: https://github.com/ORGANIZATION_NAME/REPO_NAME/granches
źródło
Oto wariant, którego szukałem:
To
tail -r
odwraca listę, więc najnowszacommiterdate
jest ostatnia.źródło
tail
ma-r
?Przesyłam dane wyjściowe z zaakceptowanej odpowiedzi do
dialog
, aby uzyskać interaktywną listę:Zapisz jako (np.)
~/bin/git_recent_branches.sh
Ichmod +x
to. Następnie,git config --global alias.rb '!git_recent_branches.sh'
aby dać mi nowegit rb
polecenie.źródło
Wiem, że jest już wiele odpowiedzi, ale oto moje dwa centy za prosty alias (lubię mieć mój najnowszy oddział na dole):
To da ci ładny przegląd twoich ostatnich 15 oddziałów, w kolorze, z podświetloną bieżącą gałęzią (i ma gwiazdkę).
źródło
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:
PS Nie mogłem skomentować z powodu mojej reputacji
źródło
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źródło
Git v2.19 wprowadza
branch.sort
opcję konfiguracji (patrz branch.sort ).Więc
git branch
domyślnie sortuje według daty zleceniodawcy (desc)scenariusz:
Aktualizacja:
Więc,
i
źródło