Come posso ottenere un elenco di rami Git, ordinati per commit più recente?


1324

Voglio ottenere un elenco di tutti i rami in un repository Git con i rami "più freschi" nella parte superiore, in cui il ramo "più fresco" è quello che è stato impegnato più di recente (ed è, quindi, più probabile che sia uno Voglio prestare attenzione a).

Esiste un modo in cui posso usare Git per (a) ordinare l'elenco dei rami in base all'ultimo commit o (b) ottenere un elenco di rami insieme alla data dell'ultimo commit di ognuno, in una sorta di formato leggibile automaticamente?

Nel peggiore dei casi, potrei sempre correre git branchper ottenere un elenco di tutti i rami, analizzarne l'output e quindi, git log -n 1 branchname --format=format:%ciper ognuno, ottenere la data di commit di ciascun ramo. Ma questo verrà eseguito su una finestra di Windows, dove l'avvio di un nuovo processo è relativamente costoso, quindi l'avvio dell'eseguibile Git una volta per ramo potrebbe rallentare se ci sono molti rami. C'è un modo per fare tutto questo con un solo comando?


2
stackoverflow.com/a/2514279/1804124 Ha una risposta migliore.
Spundun,

12
@Spundun, mi hai perso lì. In che modo una combinazione di più comandi, inclusi elementi inviati tramite perl e sed, è "migliore" rispetto all'utilizzo di un comando che Git ha già?
Joe White il

37
@Spundun per quanto riguarda la risposta git for-each-refdi Jakub Narębski: puoi far passare i rami remoti refs/remotes/invece di refs/heads/(oppure puoi passare entrambi, separati da spazi); refs/tags/per tag o solo refs/per tutti e tre i tipi.
jakub.g

4
A partire da git 2.7 (Q4 2015), non di più for-each-ref! Utilizzerai direttamente git branch --sort=-committerdate: vedi la mia risposta di seguito
VonC

Risposte:


1874

Usa l' --sort=-committerdateopzione digit for-each-ref ;

Disponibile anche da Git 2.7.0 pergit branch :

Uso di base:

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

Risultato:

Risultato

Uso avanzato:

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

Risultato:

Risultato


15
Perfetto! Posso anche limitare l'output solo ai nomi di riferimento aggiungendo --format=%(refname).
Joe White

35
Per me è meglio:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius: perché non usarlo :shortname?
Jakub Narębski,

37
@ilius: Come @BeauSmith ha scritto: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. La manpage git-for-each-ref (1) dice: Per un nome breve non ambiguo dell'appendice ref :short.
Jakub Narębski,

76
Questa è una versione colorata che include hash, messaggi, ordinati in ordine crescente in base alla data del commit, con l'età relativa dell'ultimo commit su ciascun ramo. Ho rubato tutte le idee da voi ragazzi sopra. È nel mio .gitconfig nella [alias]sezione e lo adoro. 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

Elenco dei nomi delle filiali Git, ordinati per commit più recente ...

Espandendo la risposta di Jakub e il suggerimento di Joe , i seguenti rimuoveranno "refs / heads /" in modo che l'output visualizzi solo i nomi dei rami:


Comando:

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

Risultato:

Filiali Git recenti


4
Puoi anche usare --format=%(refname:short)invece di fare affidamento cut.
Chaitanya Gupta,

3
C'è un modo per farlo per il repository REMOTE?
Allan Bowe,

10
aah - @ jakub.g già spiegato: puoi ottenere rami remoti passando ref / remoti / invece di ref / teste /. Perfetto!!
Allan Bowe,

Mi piace questo, se stai cercando di farlo alias, cosa che ho fatto, per git rbricordare di racchiudere il comando tra virgolette:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
Michael Discenza,

2
E ora puoi farlo con git branch, quindi ottenere local, remote o tutti i rami funziona come su git-branch (cioè -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

Ecco il codice ottimale, che combina le altre due risposte:

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

10
Anche un po 'ottimizzato per ottenere un risultato tabulare:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi

2
per qualche motivo ho dovuto usare le doppie virgolette su Windows, ma per il resto funzionano bene :)
amenthes,

1
@schoetbi Quel codice appare esattamente come quello di Nikolay, cosa hai cambiato per renderlo tabulare?
Enrico,

@Enrico e altri che potrebbero chiedersi la stessa cosa. nikolay ha cambiato la sua risposta usando il suggerimento di schoetbis. Spostando prima la data che è sempre della stessa lunghezza, il risultato sembra più tabulare.
johnny,

83

Ecco un semplice comando che elenca tutti i rami con gli ultimi commit:

git branch -v

Per ordinare in base al commit più recente, utilizzare

git branch -v --sort=committerdate

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


11
git branch -avse vuoi vedere anche filiali non locali.
Scott Stafford,

34
Questo non ordina per data di commit secondo la domanda.
Cas

1
È facile git branch -vincludere la data di ciascun commit elencato?
Silente,

1
che ne dici di <pre> git branch -v --sort = committerdate </pre>?
iraj jelodari,

2
Questo è bellissimo. Mi piace git branch -va --sort=-committerdatemostrare le filiali non locali, con le filiali modificate più di recente in alto.
Clinton Blackmore,

61

Uso il seguente alias:

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"

che produce:

Risultato

Usa '|' separare.


1
Grande alias! Vorrei suggerire column -ts'|'e reindirizzare i caratteri se il carattere virgola può verificarsi all'interno dei relativi timestamp nella propria lingua.
Björn Lindqvist,

1
grande alias, grazie mille. puoi migliorarlo per mostrare il ramo corrente con un altro colore o con * all'inizio?
elhadi dp ıpɐɥ ן ǝ

2
Almeno nell'ultima versione di git puoi semplicemente aggiungere '%(HEAD) ...'all'inizio della stringa di formato per ottenere lo stesso effetto senza eseguire il piping attraverso il sedcomando
Joshua Skrzypek,

5
Non riuscivo a farlo funzionare come alias git. Ho dovuto usare[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 il

11
Ho dovuto aggiungere --color = sempre per ottenere il colore. 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

Sono stato in grado di fare riferimento agli esempi precedenti per creare qualcosa che funzioni meglio per me.

git for-each-ref --sort = -committerdate refs / heads / --format = '% (authordate: short)% (color: red)% (nome oggetto: short)% (color: yellow)% (refname: short )% (color: reset) (% (color: green)% (committerdate: relative)% (color: reset)) '

Schermata di Output


1
Sembra carino, più colorato che usare direttamente git branch come ho suggerito in stackoverflow.com/a/33163401/6309 . +1
VonC,

2
Questo ha funzionato per me, a differenza di alcuni altri, quindi ho votato a favore.
Casey,

1
Ha funzionato davvero bene! Grazie! :-)
FrozenTarzan,

1
Idem - questo ha funzionato fuori dagli schemi, a differenza di molti altri che ho appena provato. Grazie.
Dan Nissenbaum,

2
Questo è pulito e ordinato. Qualche volta aggiungerei remote e authorname come questo: 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

Avevo anche bisogno di colori, tag e riferimenti remoti senza duplicati:

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

Poiché la quotazione può essere difficile, ecco l'alias di 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'"]++'"

$ <il tuo comando qui> awk: errore di sintassi vicino alla linea 1 awk: salvataggio vicino alla linea 1
Jamie Mason

@GotNoSugarBaby Stai usando virgolette singole come nell'esempio giusto? quale shell stai usando? Bash dà a quel personaggio un significato speciale altrimenti.
estani,

ehi, l'ho eseguito su / bin / bash (GNU bash, versione 4.0.28 (1) -release (i386-pc-solaris2.11)) con una copia diretta e incolla del tuo esempio - ma da allora ho eseguito su / bin / bash (GNU bash, versione 3.2.48 (1) -release (x86_64-apple-darwin12)) e funziona, quindi rimuoverò il voto negativo. Grazie mille Estani.
Jamie Mason,

@GotNoSugarBaby Uso 4.2.25 (1) -release (x86_64-pc-linux-gnu) e ho provato su 3.x e ha funzionato. Non sono sicuro di quale problema si trattasse ... ma potrebbe aver causato un problema relativo alla versione git, anziché a bash. In ogni caso, sono felice che funzioni per te!
estani,

1
@MichaelDiscenza basta solo dirigere tutto alla testa. sarebbe aggiungere | head -n20alla fine. Se stai usando l'alias, assicurati che questo rientri tra virgolette.
estani,

24

Le altre risposte non sembrano consentire il passaggio -vv per ottenere un output dettagliato.

Quindi, ecco un one-liner che ordina git branch -vvper data di commit, preservando il colore ecc:

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

Se si desidera inoltre stampare la data di commit, è possibile utilizzare invece questa versione:

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-

Uscita campione:

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

È probabilmente più leggibile suddiviso in più righe:

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-

Ciò dovrebbe funzionare anche con altri argomenti git branch, ad esempio -vvrper elencare le filiali di tracciamento remoto o -vvaper elencare le filiali di tracciamento remoto e locali.


-vvpuò essere davvero utile, grazie. Tuttavia, questa soluzione genera ancora nuovi processi per ciascun ramo, che l'OP ha voluto evitare.
musiphil,

In realtà git branchnon definisce specificamente il significato di -vv, ma solo di -v, quindi -vvdovrebbe avere lo stesso di -v.
musiphil

2
Questo è il migliore. E aggiungendo -avv, si tiene conto anche delle filiali remote. Grazie per questo!
Gopherkhan,

@musiphil La mia manpage di git branch , la sezione -v, -vv, --verbosecontiene quanto segue:If given twice, print the name of the upstream branch, as well
Perleone,

@Perleone: non so come ho ottenuto queste informazioni, ma hai ragione, e mi correggo. Grazie!
musiphil,

23

git 2.7 (Q4 2015) introdurrà l'ordinamento delle filiali usando direttamente git branch:
vedi commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 set 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 set 2015) e commit f65f139 , ... (23 set 2015) di Karthik Nayak ( KarthikNayak) .
(Unita da Junio ​​C Hamano - gitster- in commit 7f11b48 , 15 ott 2015)

In particolare, commetti aedcb7d :

branch.c: usa ' ref-filter' API

Fai ' branch.c' usa 'ref-filter API ' per iterare attraverso l'ordinamento dei riferimenti. Ciò rimuove la maggior parte del codice utilizzato in branch.c"sostituendolo con le chiamate al"ref-filter "libreria.

Si aggiunge l'opzione--sort=<key> :

Ordina in base alla chiave fornita.
Prefisso- per ordinare in ordine decrescente del valore.

È possibile utilizzare il --sort=<key> più volte opzione, nel qual caso l'ultima chiave diventa la chiave primaria.

Le chiavi supportate sono le stesse di quelle ingit for-each-ref .
L'ordinamento predefinito è l'ordinamento basato sul nome di riferimento completo (incluso refs/...prefisso). Questo elenca prima HEAD (se presente) staccato, quindi le filiali locali e infine le filiali di tracciamento remoto.

Qui:

git branch --sort=-committerdate 

Oppure (vedi sotto con Git 2.19)

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

Vedi anche commit 9e46833 (30 ott 2015) di Karthik Nayak ( KarthikNayak) .
Aiutato da: Junio ​​C Hamano ( gitster) .
(Unito da Junio ​​C Hamano - gitster- in commit 415095f , 03 nov 2015)

Quando si ordina secondo i valori numerici (ad es. --sort=objectsize) Non esiste un confronto di fallback quando entrambi i ref mantengono lo stesso valore. Ciò può causare risultati imprevisti (cioè l'ordine di elencare i ref con valori uguali non può essere predeterminato) come sottolineato da Johannes Sixt ( $ gmane / 280117 ).

Quindi, il ritorno al confronto alfabetico basato sul refname ogni volta che l'altro criterio è uguale .

$ git branch --sort=objectsize

*  (HEAD detached from fromtag)
      branch-two
      branch-one
      master

Con Git 2.19, l'ordinamento può essere impostato per impostazione predefinita.
git branchsupporta una configurazione branch.sort, come git tag, che aveva già una configurazione tag.sort.
Vedi commit 560ae1c (16 ago 2018) di Samuel Maftoul (``) .
(Unito da Junio ​​C Hamano - gitster- in commit d89db6f , 27 ago 2018)

branch.sort:

Questa variabile controlla l'ordinamento dei rami quando viene visualizzato da git-branch.
Senza l' --sort=<value>opzione " " fornita, il valore di questa variabile verrà utilizzato come predefinito.


Per elencare i rami remoti, utilizzare git branch -r --sort=objectsize. Il-r flag fa sì che elenca i rami remoti invece dei rami locali.


Con Git 2.27 (Q2 2020), le varianti " git branch" e altre " for-each-ref" hanno accettato più --sort=<key>opzioni nel crescente ordine di precedenza, ma hanno avuto alcune rotture "--ignore-case gestione " e nel legame con il nome di riferimento, che sono stati corretti.

Vedi commit 7c5045f , commit 76f9e56 (03 maggio 2020) di Jeff King ( peff) .
(Unita da Junio ​​C Hamano - gitster- in commit 6de1630 , 08 maggio 2020)

ref-filter: applica l'ordinamento refname di fallback solo dopo tutti gli ordinamenti dell'utente

Firmato-fuori-da: Jeff King

Commit 9e468334b4 (" ref-filter: fallback sul confronto alfabetico", 30-10-2015, Git v2.7.0-rc0 - unione elencata nel batch # 10 ) ha insegnato l'ordinamento di ref-filter al fallback per confrontare i nomi di ref.
Ma lo ha fatto al livello sbagliato, sovrascrivendo il risultato del confronto per un singolo "--sort chiave " da parte dell'utente, piuttosto che dopo che tutte le chiavi di ordinamento sono state esaurite.

Funzionava correttamente per una " --sort" opzione, ma non per più.
Rompiamo i legami nella prima chiave con il refname e non valutiamo mai la seconda chiave.

Per rendere le cose ancora più interessanti, abbiamo applicato questo fallback solo a volte!
Per un campo come " taggeremail" che richiede un confronto di stringhe, restituiremmo veramente il risultato strcmp(), anche se fosse 0.
Ma per " value" campi numerici come " taggerdate", abbiamo applicato il fallback. Ed è per questo che il nostro test multi-sort ha mancato questo: usa taggeremailcome confronto principale.

Quindi iniziamo aggiungendo un test molto più rigoroso. Avremo una serie di commit che esprimono ogni combinazione di due email tagger, date e nomi di nomi. Quindi possiamo confermare che il nostro ordinamento viene applicato con la precedenza corretta e colpiremo entrambi i comparatori di stringhe e valori.

Ciò mostra il bug e la correzione è semplice: compare_refs()dopo tutto, spostare il fallback sulla funzione esternaref_sorting tasti sono stati esauriti.

Nota che nella funzione esterna non abbiamo un "ignore_case"flag, poiché fa parte di ogni singolo ref_sortingelemento. È discutibile cosa dovrebbe fare un simile fallback, dal momento che non abbiamo usato le chiavi dell'utente per abbinare.
Ma fino ad ora abbiamo cercato di rispettare quella bandiera, quindi la cosa meno invasiva è cercare di continuare a farlo.
Poiché tutti i chiamanti nel codice corrente impostano il flag per tutti i tasti o per nessuno, possiamo semplicemente estrarre il flag dal primo tasto. In un mondo ipotetico in cui l'utente può davvero capovolgere la distinzione tra maiuscole e minuscole dei tasti separatamente, potremmo voler estendere il codice per distinguere quel caso da una coperta " --ignore-case".


Per elencare i telecomandi con questa opzione, aggiungi-r
Troy Daniels il

@TroyDaniels Concordato. Puoi modificare la risposta. Esaminerò la tua modifica.
VonC,

19

Mi piace usare una data relativa e abbreviare il nome della filiale in questo modo:

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

Che ti dà un output:

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

Consiglio di creare un file Bash per aggiungere tutti i tuoi alias preferiti e quindi condividere lo script con il tuo team. Ecco un esempio per aggiungere solo questo:

#!/bin/sh

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

Quindi puoi semplicemente farlo per ottenere un elenco di filiali locali ben formattato e ordinato:

git branches

Aggiornamento: fallo se vuoi colorare:

#!/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)$|$"

Questo mi dàfatal: unknown field name: '-authordate:iso8601'
Factor Mystic il

1
L'output a colori fantasia è elegante, ma questo è semplice e proprio quello che stavo cercando. Sostituisci refs/headscon refs/remotesper dare un'occhiata ai rami remoti.
Lambart,

Il comando stesso è adorabile, ma l'alias genera un errore:expansion of alias 'branches' failed; 'echo' is not a git command
Philip Kahn,

Per me va bene. Cosa succede se si copia e incolla questo nel terminale? (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)$|$"
8

17

A partire da Git 2.19 puoi semplicemente:

git branch --sort=-committerdate

Puoi anche:

git config branch.sort -committerdate

Pertanto, ogni volta che si elencano i rami nel repository corrente, questo verrà elencato in base alla data di inizio.

Se ogni volta che elenchi i rami, li vuoi ordinati per comitterdate:

git config --global branch.sort -committerdate

Disclaimer: sono l'autore di questa funzionalità in Git e l'ho implementata quando ho visto questa domanda.


2
Risposta più aggiornata, molto più semplice dell'uso di script o alias complessi 👌
mtefi,

Usare con cautela! Attenzione a tutti, questo non è un comando per elencare i rami. È un comando per cambiare la configurazione di Git e avrà ripercussioni globali permanenti.
Jazimov,

1
@Jazimov hai ragione, ho modificato la risposta in modo che sia più chiara
user801247

11

Aggiunge un po 'di colore (poiché pretty-formatnon è disponibile)

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"

9

Ho avuto lo stesso problema, quindi ho scritto una gemma di Ruby chiamata Twig . Elenca i rami in ordine cronologico (prima i più recenti) e può anche permetterti di impostare un'età massima in modo da non elencare tutti i rami (se ne hai molti). Per esempio:

$ 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

Inoltre, consente di memorizzare proprietà personalizzate per ciascun ramo, ad es. ID ticket, stato, todos e filtrare l'elenco dei rami in base a tali proprietà. Maggiori informazioni: http://rondevera.github.io/twig/


5
Quel nome potrebbe non essere di aiuto, dato che sono abbastanza sicuro che ci siano alcuni software con lo stesso nome.
Thoroc

8

Mi è venuto in mente il seguente comando (per Git 2.13 e versioni successive):

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

Se non lo columnhai, puoi sostituire l'ultima riga con

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

L'output è simile

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

Ho scritto un post sul blog su come funzionano i vari pezzi.


Bello. +1. Utilizza la git branch --sortI menzionata in stackoverflow.com/a/33163401/6309 .
VonC

@DanNissenbaum Assicurati di utilizzare Git 2.13 (rilasciato a maggio 2017) o versioni successive.
bdesham,


5

Ecco un piccolo script che uso per passare da rami recenti:

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

Utilizzando questi due alias:

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

Basta chiamarlo in un repository Git e ti mostrerà gli ultimi N rami (10 di default) e un numero a parte ciascuno. Inserisci il numero del ramo e verifica:

Inserisci qui la descrizione dell'immagine


4

Normalmente consideriamo le filiali remote di recente. Quindi prova questo

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

Ecco un altro script che fa quello che fanno tutti gli altri script. In effetti, fornisce una funzione per la tua shell.

Il suo contributo è che estrae alcuni colori dalla configurazione di Git (o utilizza i valori predefiniti).

# 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}"
}

3

Questo si basa sulla versione di saeedgnu , ma con l'attuale ramo mostrato con una stella e a colori, e mostrando solo tutto ciò che non è descritto come "mesi" o "anni" fa:

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

2

Il mio miglior risultato come sceneggiatura:

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

1
Che tipo di sceneggiatura? Bash?
Peter Mortensen,

2

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

Per chiunque sia interessato a ottenere solo i primi 5 nomi delle filiali ordinati in base alla data del committer.



1

Ecco la variante che stavo cercando:

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

Quello tail -r inverte l'elenco in modo che l'ultimo commiterdatesia l'ultimo.


3
Puoi anche cambiare --sort = -committerdate in --sort = committerdate per farlo.
riformulare il

Quale tailha -r?
Christoffer Hammarström,

1

Inoltro l'output della risposta accettata in dialog, per darmi un elenco interattivo:

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

Salva con nome (per esempio) ~/bin/git_recent_branches.she chmod +xdi esso. Quindi git config --global alias.rb '!git_recent_branches.sh'per darmi un nuovo git rbcomando.


1

So che ci sono già molte risposte, ma ecco i miei due centesimi per un semplice alias (mi piace avere il mio ramo più recente in fondo):

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

Questo ti darà una bella panoramica dei tuoi ultimi 15 rami, a colori, con il tuo ramo attuale evidenziato (e ha un asterisco).


1

Si è verificato un problema durante la gestione di virgolette singole su Mac in bash_profile durante il tentativo di impostare un alias. Questa risposta ha aiutato a risolverlo " Come sfuggire alle virgolette singole all'interno di stringhe tra virgolette singole

Soluzione di lavoro:

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 Non ho potuto commentare a causa della mia reputazione


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))' questo è quello di cui hai bisogno


0

Git v2.19 introduce l' branch.sortopzione di configurazione (vedi branch.sort ).

Quindi git branchordinerà per data committer (desc) per impostazione predefinita con

# gitconfig
[branch]
    sort = -committerdate     # desc

script:

$ git config --global branch.sort -committerdate

Aggiornare:

Così,

$ git branch
* dev
  master
  _

e

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.