2012-06-21 7 views
22

Czasami pracuję z repozytoriami kodu źródłowego zawierającymi wiele gałęzi, z których większość jest stara i zazwyczaj już nieistotna.Jak wyświetlić tylko aktywne/ostatnio zmienione oddziały w git?

W takich przypadkach pełna lista oddziałów od git branch nie jest bardzo pomocna. Czy istnieje sposób na wylistowanie tylko "aktywnych" gałęzi? Na przykład tylko gałęzie, które otrzymały zatwierdzenia w ciągu ostatnich n dni? Najlepiej byłoby, gdyby lista zawierała datę ostatniego zatwierdzenia dla każdego oddziału i wskazała, czy gałąź jest już w pełni scalona.

P.S .: Zdaję sobie sprawę, że można to również rozwiązać, usuwając "stare" gałęzie (jak omówiono np. W What to do with experimental non-merged git branches?), ale nie zawsze może to być praktyczne lub akceptowane w danym projekcie.

+0

Możliwy duplikat [Jak mogę uzyskać listę oddziałów git, zamówionych przez ostatnie zatwierdzenie?] (Http://stackoverflow.com/questions/5188320/how-can-i-get-a-listof -git-branches-ordered-by-most-recent-commit) – sleske

+0

Właśnie zdałem sobie sprawę, że to duplikat. – sleske

Odpowiedz

27

git-for-each-ref można użyć, aby uzyskać listę wszystkich lokalnych i śledzenie oddziałów posortowanych w kolejności malejącej według daty committer ostatniego popełnić tak:

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

ten wyprowadza np .:

2012-06-23 refs/heads/master 
2012-06-21 refs/remotes/origin/HEAD 
2012-06-21 refs/remotes/origin/master 

Możesz dodać --count=m, aby uzyskać co najwyżej m oddziałów, możesz --sort=-authordate zamiast używać daty wystawcy, możesz oczywiście użyć różnych formatów. for-each-ref samo w sobie nie ogranicza wyniku według daty, musi to być osobno skryptowane, ale przynajmniej masz daty z obiektu commit w ręce.

+1

Fajnie, * dokładnie * czego szukałem. To trochę ironiczne, że jest to już część git. Może powinienem przeczytać dokumenty ... – sleske

+0

Tak, ja też:/ – jkrcma

+4

Nie zapomnij uruchomić 'git remote prune origin' first, w przeciwnym razie możesz uzyskać starą listę zawierającą rzeczy, które już nie istnieją na zdalnej stronie –

7
ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done; 

Ten oneliner drukuje wszystkie lokalne oddziały posortowane według czasu od najnowszego do najstarszego. Każda gałąź ma ostatnie zatwierdzenie z czytelnym dla człowieka łańcuchem dat. Możesz dodać go do swojej .gitconfig.

dla zdalnych oddziałów wymyśliłem tym strasznym rozwiązania:

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $(echo $b | cut -d' ' -f1) --; done | sort -rn -k1,10 | cut -c11- 

Edit: im więcej myślę, tym bardziej obawiam się, to może być zawodne, ponieważ ls-remote zawsze łączy się ze zdalnym strony natomiast log nie. Może to wymagać wykonania fetch przed każdym uruchomieniem tego polecenia.

+0

Dobra sztuczka. Niestety działa to tylko w przypadku oddziałów lokalnych, a nie zdalnych (w '/ refs/remote'). Nie działa również dla lokalnych gałęzi śledzenia, ponieważ mtime pliku ref zwykle odzwierciedla ostatnie pobranie, a nie ostatnie zatwierdzenie (upstream). – sleske

+0

@sleske Mogę zrobić magię powłoki, zobacz zaktualizowaną odpowiedź :) – jkrcma