Kaip galėčiau gauti sąrašą „Git“ filialų, kuriuos užsakė naujausias įsipareigojimas?

Noriu gauti visų „Git“ saugyklos filialų sąrašą su „šviežiausiomis“ šakomis viršuje, kur „naujausias“ filialas yra tas, kuris neseniai buvo nustatytas (ir todėl greičiausiai bus vienas iš norų atkreipti dėmesį) .

Ar yra būdas, kuriuo galiu naudoti „Git“: (a) rūšiuoti filialų sąrašą pagal paskutinį įvykį arba (b) gauti filialų sąrašą kartu su kiekviena paskutine nustatymo data tam tikru mašininio skaitymo formatu?

Blogiausiu atveju galėčiau visada paleisti „ git branch kad galėčiau gauti visų filialų sąrašą, analizuoti jo išvestį ir tada git log -n 1 branchname --format=format:%ci kiekvienam iš jų, kad gautumėte kiekvieną filialo fiksavimo datą. Tačiau tai veiks „Windows“ laukelyje, kur naujo proceso kūrimas bus gana brangus, todėl, jei yra daug šakų, „Git“ vykdomąjį failą galima paleisti vieną kartą per filialą. Ar yra būdas tai padaryti su viena komanda?

977
04 марта '11 в 3:26 2011-03-04 03:26 Joe White paklausė kovo 4 d. 11 val. 03:26 2011-03-04 03:26
@ 26 atsakymai

Naudokite --sort=-committerdate git for-each-ref --sort=-committerdate git for-each-ref ;

Taip pat galima įsigyti „ Git 2.7.0“, skirtą git branch :

Pagrindinis naudojimas:

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

Rezultatas:

border=0

1379
04 марта '11 в 3:33 2011-03-04 03:33 atsakymą davė Jakubas Narębskis kovo 4 d. 11 d. 3:33 2011-03-04 03:33

Git šakų pavadinimų sąrašas, užsakytas pagal naujausius įsipareigojimus ...

Kalbant apie Jakubo atsakymą ir Joes užuominą, „refs / heads /“ išsklaidys šiuos žodžius, todėl filialų pavadinimai bus rodomi išvestyje:


Komanda:

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

Rezultatas:

2019

12 мая '11 в 4:21 2011-05-12 04:21 atsakymą pateikė „ Beau Smith “ gegužės 12 d. 11 val. 04:21 2011-05-12 04:21

Čia yra optimalus kodas, kuriame yra du kiti atsakymai:

 git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)' 
78
22 мая '12 в 2:22 2012-05-22 02:22 atsakymas pateikiamas nikolay gegužės 22 d., 12 val. 2:22 2012-05-22 02:22

Čia yra paprasta komanda, kurioje išvardijami visi filialai su naujausiais įsipareigojimais:

 git branch -v 

Norėdami užsisakyti paskutinį laikiklį, naudokite

 git branch -v --sort=committerdate 

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

68
13 марта '13 в 14:54 2013-03-13 14:54 atsakymą pateikė vartotojo1682406 kovo 13 d. 14:54 2013-03-13 14:54

Naudoju šiuos slapyvardžius:

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"

kuri gamina: 2019

38
06 мая '15 в 15:05 2015-05-06 15:05 atsakymas pateikiamas dimid'e 06 gegužės 15 d. 15:05 2015-05-06 15:05

Taip pat reikėjo spalvų, žymų ir ištrintų nuorodų be dublikatų:

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

Kadangi citavimas gali būti sunkus, čia yra pseudonimas, skirtas „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 авг. atsakymą pateikė estani 19 rug . 2013-08-19 12:27 '13, 12:27, 2013-08-19 12:27

Galėjau remtis aukščiau pateiktais pavyzdžiais, kad galėčiau sukurti kažką, kas geriausia man.

git for-each-ref --sort = -committerdate refs / heads / --format = '% (automatinis: trumpas)% (spalva: raudona)% (objekto pavadinimas: trumpas)% (spalva: geltona)% (pavadinimas: trumpas)% (spalva: atstatymas) (% (Spalva: žalia)% (committerdate: santykinis)% (spalva: reset)) '

2019

13 июня '17 в 22:09 2017-06-13 22:09 atsakymą davė Andy birželio 13 d. 17 d. 10:09 2017-06-06 22:09

Kiti atsakymai, atrodo, neleidžia -vv pateikti išsamią produkciją.

Taigi, čia yra vieno eilutės šriftas, kuris rūšiuoja git branch -vv , nustatydamas datą, išlaikydamas spalvą ir tt:

 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- 

Išvesties pavyzdys:

 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 

Tai tikriausiai yra labiau suprantamas, suskirstytas į kelias eilutes:

23
12 сент. John Mellor atsakymas rugsėjo 12 d 2013-09-12 18:06 '13, 18:06, 2013-09-12 18:06

git 2.7 (2015 m. ketvirtasis ketvirtis) pateks į filialų rūšiavimą naudodamiesi tiesioginiu git branch :
Žr. „ Commit aa3bc55“ , prisiimkite aedcb7d , įsipareigokite 1511b22 , prisiimkite f65f139 , ... (2015 m. Rugsėjo 23 d.), Įsipareigokite aedcb7d , įsipareigokite 1511b22 , įsipareigokite apie 41799 (2015 m. Rugsėjo 24 d.) Ir įsipareigokite f65f139 , ... iš Karthik Nayak ( KarthikNayak ) .
(Sujungimas su Yunio S gitster - gitster - įvykdytas 7f11b48 , 2015 m. Spalio 15 d.)

Visų pirma pataisykite aedcb7d :

branch.c : naudokite ref-filter API

Sukurkite „ branch.c “ naudojant „ ref-filter “ API, kad kartotumėte naudojant rūšiavimo ref-filter . Tai pašalina didžiąją dalį kodo, naudojamo „ branch.c “, pakeičiant jį skambučiais į „ ref-filter “ biblioteką.

Ji prideda parinktį --sort=<key> :

Rūšiuoti pagal tam tikrą raktą.
Prefiksas - rūšiavimas mažėjančia tvarka.

--sort=<key> parametrą galite naudoti kelis kartus, tokiu atveju pirminis raktas tampa paskutiniu raktu.

Palaikomi raktai yra tokie patys kaip ir git for-each-ref .
Numatytoji rūšiavimo tvarka yra rūšiuojama pagal visą pavadinimą (įskaitant prefiksus refs/... priešdėlį). Jame išvardyti atskiri skyriai (jei yra), tada vietiniai padaliniai ir galiausiai nuotolinio sekimo filialai.

Čia yra:

 git branch --sort=-committerdate 

Arba (žr. Žemiau su Git 2.19)

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

Taip pat žr. Komisiją 9e46833 (2015 m. Spalio 30 d.) KarthikNayak ( KarthikNayak ) .
Padėjėjas: Junio ​​S Hamano ( gitster ) .
(Sujungimas su Unio S Hamano - gitster - įsipareigojo 415095f , 2015 m. Lapkričio 3 d.)

--sort=objectsize pagal skaitines reikšmes (pvz., --sort=objectsize ), nėra lyginamojo palyginimo, kai abu refs saugo tą pačią vertę. Tai gali lemti netikėtus rezultatus (t. Y. Nuorodų sąrašo su lygiomis vertėmis tvarka negali būti iš anksto nustatyta), kaip nurodė Johannes Sixt ( $ gmane / 280117 ).

Todėl grįžimas į abėcėlinį palyginimą remiantis pavadinimu, kai kitas kriterijus yra lygus .

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

Naudojant Git 2.19, rūšiavimo tvarką galima nustatyti pagal nutylėjimą.
git branch palaiko „ branch.sort “ konfigūraciją, pvz., „ git tag , kuri jau turi „ tag.sort .
Žr. Samuel Maftoul ( 2018 m. Rugpjūčio 16 d.) 560ae1c fiksaciją ('') .
(Sujungimas su Junio ​​S Hamano - gitster - vykdant d89db6f , 2018 m. Rugpjūčio 27 d.)

 branch.sort: 

Šis kintamasis reguliuoja filialų rūšiavimo tvarką, rodant git-branch .
Be --sort=<value> " --sort=<value> " šio kintamojo vertė bus naudojama pagal nutylėjimą.


Norėdami nurodyti nuotolinius filialus, naudokite git branch -r --sort=objectsize . -r vėliava vietoj filialų sukelia savo -r nuotolinius filialus.

21
16 окт. atsakymas pateikiamas VonC 16 okt. 2015-10-16 08:53 '15, 8:53, 2015-10-16 08:53

Man patinka naudoti santykinę datą ir filialo pavadinimą sutrumpinti taip:

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

Kas duoda 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 

Aš rekomenduoju padaryti „bash“ failą, kad pridėtumėte visus mėgstamiausius slapyvardžius, ir tada perduokite scenarijų į komandą. Čia pateikiamas pavyzdys:

 #!/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 galite tiesiog tai padaryti, kad gautumėte gražiai suformatuotą ir surūšiuotą vietinių filialų sąrašą:

 git branches 

Atnaujinti: tai atlikite, jei norite spalvoti:

 #!/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 atsakymas pateikiamas n8tr gegužės 30 d. 14 val. 1:30 2014-05-30 01:30

Prideda tam tikrą spalvą (nes nėra pretty-format )

 [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 янв. atsakymas pateikiamas epylinkn 27 sausis 2014-01-27 22:23 '14, 10:23 AM 2014-01-27 22:23

Naudodami git 2.19 galite tiesiog:

 git branch --sort=-committerdate 

Taip pat galite:

 git config branch.sort -committerdate 

Todėl, kai jūs nurodote filialus dabartinėje saugykloje, ji bus rūšiuojama pagal komandų keitimo komandą.

Jei kada nurodote filialus, norite juos surūšiuoti pagal komandų pavadinimą:

 git config --global branch.sort -committerdate 

Atsakomybės apribojimas: aš esu šios funkcijos autorius, aš jį įgyvendinau, kai pamačiau šį klausimą.

9
12 сент. Atsakymą pateikė user801247 Sep 12 2018-09-12 16:05 '18, 16:05 val. 2018-09-12 16:05

Turėjau tą pačią problemą, todėl parašiau Ruby perlą, vadinamą Twig . Jis nurodo filialus chronologine tvarka (naujausiomis), taip pat leidžia nustatyti maksimalų amžių, kad nenurodytumėte visų filialų (jei turite daug jų). Pavyzdžiui:

 $ 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 

Jis taip pat leidžia jums išsaugoti kiekvienos šakos pasirinktines savybes, pavyzdžiui, bilieto ID, būseną, faktus ir filtruoti šakų sąrašą pagal šias savybes. Daugiau informacijos: http://rondevera.github.io/twig/

8
08 июня '13 в 8:40 2013-06-08 08:40 atsakymą pateikė Ron DeVera, birželio 8 d., 13 d., 8:40 2013-06-08 08:40

Aš atėjau šią komandą (už Git 2.13 ir naujesnę):

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

Jei neturite column , galite pakeisti paskutinę eilutę.

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

Išvaizda atrodo

 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 

Aš parašiau dienoraščio įrašą apie tai, kaip veikia skirtingi darbai.

8
01 авг. atsakymas duotas bdesham 01 rug . 2017-08-01 03:26 '17 at 3:26 2017-08-01 03:26

FYI, jei norite gauti neseniai parašytų filialų sąrašą (o ne neseniai sukurtus filialus), galite naudoti git reflog:

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

Taip pat žiūrėkite: Kaip gauti neseniai patikrintų git šakų sąrašą?

7
02 авг. Atsakymą pateikė Jordan Brough, rugpjūčio 2 d 2014-08-02 15:42 '14, 15:42 2014-08-02 15:42

Čia yra dar vienas scenarijus, kuris atlieka visus kitus scenarijus. Tiesą sakant, tai suteikia jūsų apvalkalui funkciją.

Jo indėlis yra tas, kad jis ištraukia kai kurias spalvas iš savo git konfigūracijos (arba naudoja numatytasis vertes).

 # 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 апр. joeytwiddle atsakymas 09 Apr. 2014-04-09 22:46 '14, 10:46 pm 2014-04-09 22:46

Štai mažas scenarijus, kurį naudoju, norėdamas pereiti nuo paskutinių filialų:

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

Naudojant šiuos du slapyvardžius

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

Tiesiog pavadinkite jį git repo, ir jis parodys paskutinius N filialus (10 pagal nutylėjimą) ir skaičių kiekvienos kryptimi. Įveskite šakos numerį ir patikrina:

2019

30 нояб. Atsakymą pateikė Agus Arias, lapkričio 30 d 2016-11-30 01:09 '16 at 1:09 2016-11-30 01:09

Remiantis iliuso versija, bet su dabartiniu filialu, kurį rodo žvaigždė ir spalva, ir rodomas tik kažkas, kuris prieš tai nėra aprašytas kaip „mėnesiai“ arba „metai“:

3
13 авг. Marko Lodato atsakymas 13 rug. 2013-08-13 18:44 '13, 18:44 2013-08-13 18:44

Geriausias rezultatas kaip scenarijus:

 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 atsakymą pateikė saeedgnu liepos 1 d. 13 d. 16:10 2013-07-01 16:10

Vėlavimas šaliai čia. Priimtas atsakymas yra atsakingas už CML, bet jei jums reikia kažko gražaus, pavyzdžiui, GUI, ir jūsų kilmės === "github".

Repo galite spustelėti „Filialai“. arba spustelėkite tiesioginį URL: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches

1
11 июня '14 в 17:36 2014-06-11 17:36 atsakymą pateikė jahrichie, birželio 11 d., 14 d., 17:36 val. 2014-06-11 17:36

Aš gaunu iš gauto atsakymo išvestį dialog , kad galėčiau pateikti interaktyvų sąrašą:

1
14 янв. John Delaney atsakymas dėl sausio 14 d 2016-01-14 17:59 '16 at 17:59 pm 2016-01-14 17:59

Čia yra variantas, kurio ieškojau:

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

Ši tail -r atšaukia sąrašą, taigi paskutinis commiterdate yra paskutinis.

1
14 мая '14 в 20:36 2014-05-14 20:36 atsakymą pateikė Ben gegužės 14 d. 14 val. 20:36 2014-05-14 20:36

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

Asmenims, norintiems surūšiuoti tik 5 svarbiausius filialų pavadinimus pagal užsakovo datą.

1
18 янв. atsakymą vardinas paskelbė sausio 18 d 2019-01-18 14:02 '19 at 2:02 pm 2019-01-18 14:02

„Git v2.19“ reiškia „ branch.sort (žr. „ Branch.sort“ ) branch.sort konfigūraciją.

Taigi, git branch pagal nutylėjimą git branch į komandą (desc) su

 # gitconfig [branch] sort = -committerdate # desc 

scenarijus:

 $ git config --global branch.sort -committerdate 

Atnaujinti:

Taigi

 $ git branch * dev master _ 

ir taip pat

 $ git branch -v * dev 0afecf5 Merge branch 'oc' into dev master 652428a Merge branch 'dev' _ 7159cf9 Merge branch 'bashrc' into dev 
0
18 сент. atsakymas pateikiamas 18 sep . 2018-09-18 07:53 '18, 07:53 2018-09-18 07:53

Žinau, kad jau yra daug atsakymų, bet čia yra du centai už paprastą slapyvardį (man patinka, kai mano paskutinis filialas žemiau žemiau):

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

Tai suteiks jums gerą paskutinių 15 spalvotų šakų apžvalgą, pažymėtą dabartinę šaką (pažymėta žvaigždute).

0
07 февр. Atsakyti Tom 07 Vas 2019-02-07 03:42 '19 at 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))' būtent tai jums reikia

0
10 апр. Atsakymas pateikiamas „ ChunkCoder“ 10 d. 2018-04-10 22:32 '18, 10:32 pm 2018-04-10 22:32

Kiti klausimai apie žymas „ arba „ Užduoti klausimą“