Frage Wie kann ich eine Liste mit Git-Verzweigungen erhalten, geordnet nach dem letzten Commit?


Ich möchte eine Liste aller Zweige in einem Git-Repository mit den "frischesten" Zweigen an der Spitze erhalten, wobei der "frischste" Zweig derjenige ist, dem man sich zuletzt verschrieben hat (und daher eher einer ist) Ich möchte darauf achten).

Gibt es eine Möglichkeit, Git zu verwenden, um (a) die Liste der Zweige nach dem letzten Commit zu sortieren, oder (b) eine Liste der Zweige zusammen mit dem Datum des letzten Commits in einer Art maschinenlesbarem Format zu erhalten?

Im schlimmsten Fall konnte ich immer laufen git branch um eine Liste aller Zweige zu erhalten, parse seine Ausgabe und dann git log -n 1 branchname --format=format:%ci für jeden, um das Commit-Datum jeder Niederlassung zu erhalten. Dies wird jedoch auf einer Windows-Box ausgeführt, wo das Hochfahren eines neuen Prozesses relativ teuer ist. Daher kann das Starten der git-ausführbaren Datei einmal pro Zweig langsam werden, wenn viele Zweige vorhanden sind. Gibt es eine Möglichkeit, all dies mit einem einzigen Befehl zu tun?


891
2018-03-04 00:26


Ursprung


Antworten:


Benutzen --sort=-committerdate Option von git for-each-ref;
  Auch verfügbar seit Git 2.7.0 zum git branch:

Grundlegende Verwendung:

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

Ergebnis:

result

Erweiterte Verwendung:

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

Ergebnis:

result


1220
2018-03-04 00:33



Liste der git-Zweignamen, sortiert nach dem letzten Commit ...

Erweiternd auf Jakubs Antwort und Joes Tipp wird das Folgende die "refs / heads /" entfernen, so dass die Ausgabe nur die Zweignamen anzeigt:


Befehl:

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

Ergebnis:

recent git branches


110
2018-05-12 01:21



Hier ist der optimale Code, der die anderen beiden Antworten kombiniert:

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

74
2018-05-21 23:22



Hier ist ein einfacher Befehl, der alle Zweige mit den letzten Commits auflistet:

git branch -v

Um nach dem letzten Commit zu sortieren, verwenden Sie

git branch -v --sort=committerdate

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


64
2018-03-13 11:54



Ich benutze den folgenden 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"

was produziert: result

Bearbeiten: Verwenden Sie '|' trennen, dank @ Björn Lindqvist

Update: hinzugefügt * vor dem aktuellen Zweig, dank @elhadi
Bearbeiten: Es wurde ein Fall korrigiert, in dem der aktuelle Zweig ein Teilstring eines anderen Zweigs war

Bearbeiten: Verwenden Sie eine einfachere Syntax für den aktuellen Zweig, dank @ Joshua Skrzypek


36
2018-05-06 12:05



Ich brauchte auch Farben, Tags und Remote-Referenzen ohne Duplikate:

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

Weil das Quoting schwer sein kann, hier der Alias ​​für 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'"]++'"

34
2017-08-19 09:27



Die anderen Antworten scheinen kein Bestehen zuzulassen -vv um eine ausführliche Ausgabe zu erhalten.

Also hier ist ein One-Liner, der sortiert git branch -vv nach Festschreibung, Erhaltung der Farbe usw.:

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

Wenn Sie zusätzlich das Commit-Datum drucken möchten, können Sie stattdessen diese Version verwenden:

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-

Beispielausgabe:

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

Es ist wahrscheinlich besser lesbar in mehrere Zeilen aufgeteilt:

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-

Dies sollte auch mit anderen Argumenten funktionieren git branch, z.B. -vvr um Remote-Tracking-Zweige aufzulisten, oder -vva um sowohl Remote-Tracking als auch lokale Zweige aufzulisten.


22
2017-09-12 15:06



Ich verwende gerne ein relatives Datum und kürze den Zweignamen so:

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

Was gibt Ihnen die Ausgabe:

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

Ich empfehle, eine Bash-Datei zu erstellen, um all Ihre Lieblingsaliasnamen hinzuzufügen und das Skript dann an Ihr Team weiterzugeben. Hier ist ein Beispiel, um nur dieses hinzuzufügen:

#!/bin/sh

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

Dann können Sie das tun, um eine gut formatierte und sortierte lokale Verzweigungsliste zu erhalten:

git branches

Aktualisieren: Tun Sie dies, wenn Sie Färbung wünschen:

#!/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
2018-05-29 22:30