Kako mogu dobiti popis Git grana naručenih prema zadnjem urezivanju?

Želim dobiti popis svih grana u Git repozitoriju s "najsvježijim" granama na vrhu, gdje je "najsvježiji" ogranak onaj koji je nedavno fiksiran (i stoga će najvjerojatnije biti jedno od toga što želim skrenuti pozornost) ,

Postoji li način na koji mogu koristiti Git za: (a) sortiranje popisa grana zadnjim urezivanjem ili (b) dobivanje popisa grana zajedno sa svakim zadnjim datumom popravka u nekoj vrsti strojno čitljivog formata?

U najgorem slučaju, uvijek sam mogao pokrenuti git branch kako bih dobio popis svih grana, analizirao njegov izlaz, a zatim git log -n 1 branchname --format=format:%ci za svaki od njih da dobije svaki datum fiksiranja grana. Ali to će raditi u okviru Windowsa, gdje će razvoj novog procesa biti relativno skup, tako da pokretanje izvršne datoteke Git jednom po grani može biti usporeno ako postoji mnogo grana. Postoji li način da se sve to radi s jednom naredbom?

977
04 марта '11 в 3:26 2011-03-04 03:26 Joe White je pitao 04. ožujka 2011. u 3:26 2011-03-04 03:26
@ 26 odgovora

Upotrijebite --sort=-committerdate u git for-each-ref ;

Dostupno i iz Git 2.7.0 za git branch :

Glavna namjena:

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

rezultat:

border=0

1379
04 марта '11 в 3:33 2011-03-04 03:33 odgovor je dao Jakub Narębski 04. ožujka 2011. u 3:33 2011-03-04 03:33

Popis naziva git grana prema zadnjem unosu ...

Okrećući se Jakubsovom odgovoru i Joesovom savjetu, sljedeće će izići iz "refs / heads /", tako da će imena grana biti prikazana na izlazu:


tim:

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

rezultat:

2019

Evo optimalnog koda koji kombinira dva druga odgovora:

 git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)' 
78
22 мая '12 в 2:22 2012-05-22 02:22 odgovor je dat nikolay 22. svibnja '12 u 2:22 2012-05-22 02:22

Ovdje je jednostavna naredba koja navodi sve grane s najnovijim unosima:

 git branch -v 

Za naručivanje zadnjeg spremnika upotrijebite

 git branch -v --sort=committerdate 

Izvor: http://git-scm.com/book/en/Git-Branching-Branch-Management

68
13 марта '13 в 14:54 2013-03-13 14:54 odgovor je dao korisnik1682406 13. ožujka '13 u 14:54 2013-03-13 14:54

Koristim sljedeći pseudonim:

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"

koji proizvodi: 2019

38
06 мая '15 в 15:05 2015-05-06 15:05 odgovor je dat dimid 06 Svi '15 u 15:05 2015-05-06 15:05

Također su mi bile potrebne boje, oznake i izbrisane veze bez duplikata:

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

Zato što citiranje može biti teško, ovdje je pseudonim za 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'"]++'" 
36
19 авг. odgovor je dao estani 19 aug. 2013-08-19 12:27 '13 u 12:27 2013-08-19 12:27

Mogao sam se pozvati na gore navedene primjere da bih stvorio nešto što je najbolje za mene.

git for-each-ref --sort = -commiterdate refs / heads / --format = '% (authordate: short)% (boja: crvena)% (naziv objekta: kratko)% (boja: žuta)% (ime: kratka)% (boja: reset) (% (boja: zelena)% (Commitedate: relative)% (boja: reset)) '

2019

13 июня '17 в 22:09 2017-06-13 22:09 odgovor je dao Andy 13. lipnja '17. u 10:09 2017-06-06 22:09

Čini se da drugi odgovori ne dopuštaju -vv za detaljan izlaz.

Dakle, evo jednog retka koji sortira git branch -vv fiksiranjem datuma, zadržavajući boju, itd.:

 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- 

Primjer izlaza:

 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 

Ovo je vjerojatno čitljiviji podijeljen na nekoliko redaka:

23
12 сент. Odgovor dao John Mellor 12. rujna 2013-09-12 18:06 '13 u 18:06 2013-09-12 18:06

git 2.7 (4. kvartal 2015.) ući će u razvrstavanje grana pomoću git branch za izravni git branch :
Vidi Commit aa3bc55 , urezivanje aedcb7d , urezivanje 1511b22 , urezivanje f65f139 , ... (23. rujna 2015.), urezivanje aedcb7d , urezivanje 1511b22 , predaja ca41799 (24. rujna 2015.) i predaja f65f139 , ... (23. rujna 2015.) od Karthik Nayak ( KarthikNayak ) .
(Spajanje s Yunio S gitster - gitster - počinio 7f11b48 , 15. listopada 2015.)

Osobito popravite aedcb7d :

branch.c : koristite API za ref-filter

Stvorite ' branch.c ' pomoću API ref-filter ja ' ref-filter ' za iteriranje pomoću sortiranja refs. Ovo uklanja veći dio koda koji se koristi u " branch.c ", zamjenjujući ga pozivima na biblioteku " ref-filter ".

Dodaje opciju --sort=<key> :

Sortiraj prema zadanoj tipki.
Prefiks - sortiranje u silaznom redoslijedu vrijednosti.

--sort=<key> možete koristiti nekoliko puta, pri čemu primarni ključ postaje posljednji ključ.

Podržani ključevi su isti kao u git for-each-ref .
Zadani redoslijed sortiranja je sortiran na temelju punog imena (uključujući refs/... prefiks). U njemu se navode pojedina poglavlja (ako ih ima), zatim lokalne grane i, konačno, grane za daljinsko praćenje.

Evo:

 git branch --sort=-committerdate 

Ili (vidi dolje s Git 2.19)

 # if you are sure to /always/ want to see branches ordered by commits: git config --global branch.sort -committerdate git branch 

Vidi također proviziju 9e46833 (30. listopada 2015.) KarthikNayak ( KarthikNayak ) .
Asistent: Junio ​​S gitster ( gitster ) .
(Spajanje s Unio S gitster - gitster - počinio 415095f , 3. studenoga 2015.)

Kada sortiranje po numeričkim vrijednostima (na primjer, --sort=objectsize ), nema usporedne usporedbe kada oba refs-a pohranjuju istu vrijednost. To može dovesti do neočekivanih rezultata (tj. Redoslijed unosa veza s jednakim vrijednostima ne može biti unaprijed određen), kao što je naznačio Johannes Sixt ( $ gmane / 280117 ).

Prema tome, povratak na abecednu usporedbu na temelju imena kada je drugi kriterij jednak .

 $ git branch --sort=objectsize * (HEAD detached from fromtag) branch-two branch-one master 

Uz Git 2.19, redoslijed sortiranja može se postaviti prema zadanim postavkama.
git branch podržava konfiguraciju branch.sort , na primjer git tag , koji već ima tag.sort .
Vidi Fiksiranje 560ae1c (16. kolovoza 2018.) Samuel Maftoul ('') .
(Spajanje s Junio ​​S gitster - gitster - u izvršenju d89db6f , 27. kolovoza 2018.)

 branch.sort: 

Ova varijabla kontrolira poredak razvrstavanja grana pri prikazivanju git-branch .
Bez --sort=<value> " --sort=<value> " vrijednost ove varijable će se koristiti prema zadanim postavkama.


Da biste naveli udaljene grane, koristite git branch -r --sort=objectsize . -r zastavica uzrokuje njezine -r udaljene grane umjesto lokalnih grana.

21
16 окт. odgovor je dat VonC 16 okt. 2015-10-16 08:53 '15 u 8:53 2015-10-16 08:53

Volim koristiti relativni datum i skratiti naziv grane na sljedeći način:

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

Što daje rezultat:

 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 

Preporučujem izradu bash datoteke za dodavanje svih vaših omiljenih pseudonima, a zatim proslijedite skriptu vašoj naredbi. Evo primjera dodavanja samo ovoga:

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

Tada jednostavno možete to učiniti da biste dobili lijepo oblikovani i razvrstani popis lokalnih podružnica:

 git branches 

Ažuriraj: učinite to ako želite obojiti:

 #!/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)$|$" 
19
30 мая '14 в 1:30 2014-05-30 01:30 odgovor je dan n8tr 30. svibnja 14 u 1:30 2014-05-30 01:30

Dodaje neku boju (jer pretty-format dostupan)

 [alias] branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09" 
11
27 янв. odgovor je dan epylinkn 27. siječnja 2014-01-27 22:23 '14 u 10:23 AM 2014-01-27 22:23

Uz git 2.19 možete jednostavno:

 git branch --sort=-committerdate 

Također možete:

 git config branch.sort -committerdate 

Stoga, kad god navedete grane u trenutnom spremištu, bit će razvrstane po naredbi CommiteDate.

Ako svaki put kad odredite grane, želite ih razvrstati prema naredbi comitterdate:

 git config --global branch.sort -committerdate 

Odricanje od odgovornosti: Ja sam autor ove funkcije u git-u, implementirao sam ga kada sam vidio ovo pitanje.

9
12 сент. Odgovor daje korisnik801247 ruj 12 2018-09-12 16:05 '18 u 16:05 sati 2018-09-12 16:05

Imao sam isti problem, pa sam napisao Rubin biser nazvan Twig . Ona popisuje grane u kronološkom redoslijedu (prvo najnovije) i također vam omogućuje da postavite maksimalnu dob tako da ne popisujete sve grane (ako ih imate mnogo). Na primjer:

 $ 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 

Također vam omogućuje spremanje prilagođenih svojstava za svaku granu, primjerice ID ulaznice, status, zadatke i filtriranje popisa grana prema tim svojstvima. Više informacija: http://rondevera.github.io/twig/

8
08 июня '13 в 8:40 2013-06-08 08:40 odgovor je dao Ron DeVera 08. lipnja '13 u 8:40 2013-06-08 08:40

Došao sam do sljedeće naredbe (za Git 2.13 i novije):

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

Ako nemate column , možete zamijeniti posljednji redak.

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

Izlaz izgleda ovako

 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 

Napisao sam post o tome kako različiti radovi funkcioniraju.

8
01 авг. odgovor je dat bdesham 01 aug. 2017-08-01 03:26 '17 u 3:26 2017-08-01 03:26

FYI, ako želite dobiti popis nedavno napisanih grana (za razliku od nedavno kreiranih), možete koristiti git reflog:

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

Vidi također: Kako dobiti popis git grana koje sam nedavno provjerio?

7
02 авг. Odgovor je dao Jordan Brough 02 Aug 2014-08-02 15:42 '14 u 15:42 2014-08-02 15:42

Ovdje je još jedna skripta koja izvršava sve ostale skripte. Zapravo, on pruža funkciju za vašu ljusku.

Njegov je doprinos taj da izvlači neke boje iz vaše git konfiguracije (ili koristi zadane vrijednosti).

 # 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}" } 
4
09 апр. odgovor dao joeytwiddle 9. travnja. 2014-04-09 22:46 '14 u 22:46 2014-04-09 22:46

Evo male skripte koju koristim za prebacivanje između nedavnih grana:

 #!/bin/bash # sudo bash re='^[0-9]+$' if [[ "$1" =~ $re ]]; then lines="$1" else lines=10 fi branchs="$(git recent | tail -n $lines | nl)" branchs_nf="$(git recent-nf | tail -n $lines | nl)" echo "$branchs" # Prompt which server to connect to max="$(echo "$branchs" | wc -l)" index= while [[ ! ( "$index" =~ ^[0-9]+$  "$index" -gt 0  "$index" -le "$max" ) ]]; do echo -n "Checkout to: " read index done branch="$( echo "$branchs_nf" | sed -n "${index}p" | awk '{ print $NF }' )" git co $branch clear 

Koristeći ta dva pseudonima

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

Samo ga navedite u git repo, i on će vam pokazati posljednje N grana (10 prema zadanim postavkama) i broj u smjeru svakog od njih. Unesite broj podružnice i provjerava:

2019

30 нояб. Odgovor je dao Agus Arias 30. studenog 2016-11-30 01:09 '16 u 1:09 2016-11-30 01:09

Na temelju ilusne verzije, ali s trenutnom granom, prikazanom zvjezdicom i bojom, i prikazuje samo nešto što nije opisano kao "mjeseci" ili "godina" prije:

3
13 авг. odgovor dao Mark Lodato 13 kol. 2013-08-13 18:44 '13 u 18:44 2013-08-13 18:44

Moj najbolji rezultat kao skripta:

 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 
2
01 июля '13 в 16:10 2013-07-01 16:10 odgovor je dao saeedgnu 1. srpnja '13 u 16:10 2013-07-01 16:10

Kasno za zabavu ovdje. Prihvaćeni odgovor je CML odgovoran, ali ako trebate nešto lijepo, kao GUI, i vaše podrijetlo === "github".

Možete kliknuti na "Podružnice" u repo. ili kliknite izravni URL: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches

1
11 июня '14 в 17:36 2014-06-11 17:36 odgovor je dao jahrichie 11. lipnja '14. u 17:36 sati 2014-06-11 17:36

Donosim izlaz iz primljenog odgovora u dialog da bih dobio interaktivni popis:

1
14 янв. Odgovor dao je John Delaney 14. siječnja 2016-01-14 17:59 '16 u 17:59 2016-01-14 17:59

Evo varijacije koju sam tražio:

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

Ovaj tail -r poništava popis, tako da je posljednje commiterdate posljednje.

1
14 мая '14 в 20:36 2014-05-14 20:36 odgovor je dao Ben 14. svibnja '14 u 20:36 2014-05-14 20:36

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

Za svakoga tko je zainteresiran za razvrstavanje samo 5 najboljih naziva podružnica na temelju datuma počinitelja.

1
18 янв. odgovor daje vardin 18. siječnja 2019-01-18 14:02 '19 u 2:02 pm 2019-01-18 14:02

Git v2.19 predstavlja konfiguraciju branch.sort (pogledajte Branch.sort ).

Dakle, git branch će po defaultu sortirati komitenta (desc) s

 # gitconfig [branch] sort = -committerdate # desc 

scenarij:

 $ git config --global branch.sort -committerdate 

ažuriranje:

Na primjer,

 $ git branch * dev master _ 

i također

 $ git branch -v * dev 0afecf5 Merge branch 'oc' into dev master 652428a Merge branch 'dev' _ 7159cf9 Merge branch 'bashrc' into dev 
0
18 сент. odgovor se daje HIPI 18 sep . 2018-09-18 07:53 '18 u 7:53 2018-09-18 07:53

Znam da već postoji mnogo odgovora, ali evo mojih dva centa za jednostavan pseudonim (sviđa mi se kada je moja zadnja grana dolje):

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

To će vam dati dobar pregled zadnjih 15 obojenih grana, s označenom trenutnom granom (označena je zvjezdicom).

0
07 февр. Odgovori Tom 07 Feb 2019-02-07 03:42 '19 u 3:42 2019-02-07 03:42

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))' ovo je ono što trebate

0
10 апр. Odgovor se daje ChunkCoder 10 apr. 2018-04-10 22:32 '18 u 22:32 sati 2018-04-10 22:32

Ostala pitanja o oznakama ili Postavite pitanje