it-swarm.com.de

Wie kann ich eine Liste der Git-Zweige erhalten, sortiert nach dem letzten Commit?

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

Gibt es eine Möglichkeit, Git zu verwenden, um entweder (a) die Liste der Zweige nach dem letzten Commit zu sortieren oder (b) eine Liste der Zweige zusammen mit dem Datum der letzten Commit-Einstellungen eines jeden in einem maschinenlesbaren Format zu erhalten?

Im schlimmsten Fall könnte ich git branch ausführen, um eine Liste aller Verzweigungen zu erhalten, die Ausgabe zu analysieren und dann git log -n 1 branchname --format=format:%ci für jeden Zweig, um das Festschreibungsdatum der einzelnen Verzweigungen zu ermitteln. Dies wird jedoch auf einer Windows-Box ausgeführt, in der das Hochfahren eines neuen Prozesses relativ teuer ist. Daher könnte das einmalige Starten der ausführbaren Git-Datei pro Zweig langsam werden, wenn viele Zweigstellen vorhanden sind. Gibt es eine Möglichkeit, dies alles mit einem einzigen Befehl zu erledigen?

984
Joe White

Verwenden Sie die Option --sort=-committerdate von git for-each-ref ;

Auch verfügbar seit Git 2.7.0 für git branch :

Grundnutzung:

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

Fortgeschrittene Nutzung:

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

1407
Jakub Narębski

Liste der Namen der Git-Zweige, geordnet nach dem letzten Commit…

Wenn Jakubs Antwort und Joes Tipp erweitert werden, werden die "refs/heads /" mit dem folgenden Befehl entfernt, 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

113
Beau Smith

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

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

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

git branch -v

Um nach dem letzten Commit zu bestellen, verwenden Sie

git branch -v --sort=committerdate

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

68
user1682406

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"

welche produziert: result

Bearbeiten: benutze '|' zu trennen, danke an @ Björn Lindqvist

Update: * vor dem aktuellen Zweig hinzugefügt, dank @ elhadi
Bearbeiten: Ein Problem wurde behoben, bei dem der aktuelle Zweig ein Teilstring eines anderen Zweigs war

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

49
dimid

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 Zitieren 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'"]++'"
36
estani

Ich konnte auf die obigen Beispiele verweisen, um etwas zu schaffen, das für mich am besten funktioniert.

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

 Screenshot of Output

24
Andy

Die anderen Antworten scheinen keine Übergabe von -vv zu erlauben, um eine ausführliche Ausgabe zu erhalten.

Hier ist ein Einzeiler, der git branch -vv nach dem Festschreibungsdatum sortiert, die Farbe behält 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 ausdrucken 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 lesbarer 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 für git branch funktionieren, z. -vvr, um Fernverfolgungszweige aufzulisten, oder -vva, um sowohl Fernverfolgung als auch lokale Zweigstellen aufzulisten.

23
John Mellor

git 2.7 (Q4 2015) führt die Branchensortierung mit direktem git branch ein:
Siehe Festschreiben aa3bc55 , Festschreiben aedcb7d , Festschreiben 1511b22 , Festschreiben f65f139 , ... (23 Sep 2015), Festschreiben aedcb7d , Festschreiben 1511b22 , Festschreiben ca41799 (24. September 2015) und Festschreiben f65f139 , ... (23. September 2015) von Karthik Nayak (KarthikNayak) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Festschreiben 7f11b48 , 15. Oktober 2015)

Insbesondere commit aedcb7d :

branch.c: Verwenden Sie 'ref-filter'-APIs

Machen Sie 'branch.c' und verwenden Sie 'ref-filter' APIs, um durch die Sortierung von Refs zu iterieren. Dadurch wird der größte Teil des in 'branch.c' verwendeten Codes entfernt, und es wird durch Aufrufe der Bibliothek 'ref-filter' ersetzt.

Es fügt die Option --sort=<key> hinzu :

Sortiert nach dem angegebenen Schlüssel.
Präfix - zum Sortieren in absteigender Reihenfolge des Werts. 

Sie können die Option --sort=<key> mehrmals verwenden. In diesem Fall wird der letzte Schlüssel zum Primärschlüssel. 

Die unterstützten Schlüssel sind die die gleichen wie in git for-each-ref .
Die Sortierreihenfolge ist standardmäßig auf der Grundlage des vollständigen Referenznamens (einschließlich des Präfixes refs/...) sortiert. In dieser Liste werden zunächst HEAD (falls vorhanden), dann lokale Zweigstellen und schließlich Fernverfolgungszweige aufgelistet.

Hier:

git branch --sort=-committerdate 

Oder (siehe unten mit Git 2.19)

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

Siehe auch Festschreiben 9e46833 (30. Oktober 2015) von Karthik Nayak (KarthikNayak) .
Geholfen hat: Junio ​​C Hamano (gitster) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Festschreiben 415095f , 03 Nov 2015)

Bei der Sortierung nach numerischen Werten (z. B. --sort=objectsize) gibt es keinen Fallback-Vergleich, wenn beide Referenzen den gleichen Wert enthalten. Dies kann zu unerwarteten Ergebnissen führen (d. H. Die Reihenfolge der Auflistung von Refs mit gleichen Werten kann nicht vorab festgelegt werden), wie von Johannes Sixt ( $ gmane/280117 ) aufgezeigt.

Daher gilt Rückfall zum alphabetischen Vergleich basierend auf dem Referenznamen wann immer das andere Kriterium gleich ist.

$ git branch --sort=objectsize

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

In Git 2.19 kann die Sortierreihenfolge standardmäßig festgelegt werden.
git branch unterstützt eine config branch.sort, wie git tag, die bereits eine config tag.sort hatte.
Siehe Festschreiben 560ae1c (16. August 2018) von Samuel Maftoul (``) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Festschreiben von d89db6f , 27. August 2018)

branch.sort:

Diese Variable steuert die Sortierreihenfolge der Zweige, wenn sie von git-branch angezeigt wird.
Ohne die Option "--sort=<value>" wird der Wert dieser Variablen als Standardwert verwendet.


Verwenden Sie git branch -r --sort=objectsize, um entfernte Verzweigungen aufzulisten. Das Flag -r führt dazu, dass entfernte Verzweigungen anstelle von lokalen Verzweigungen aufgelistet werden.

21
VonC

Ich mag es, ein relatives Datum zu verwenden und den Zweignamen wie folgt zu verkürzen:

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

Was gibt Ihnen 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 alle Ihre bevorzugten Aliase hinzuzufügen und das Skript anschließend 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 dies einfach tun, um eine schön formatierte und sortierte lokale Zweigliste zu erhalten:

git branches

Update: Tun Sie dies, wenn Sie eine 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
n8tr

Fügt etwas Farbe hinzu (da pretty-format nicht verfügbar ist)

[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
epylinkn

Ab git 2.19 können Sie einfach:

git branch --sort=-committerdate

Du kannst auch:

git config branch.sort -committerdate

Jedes Mal, wenn Sie im aktuellen Repository Zweigstellen auflisten, wird dies nach Committerdate sortiert.

Wenn Sie Zweige auflisten, möchten Sie, dass sie nach comitterdate sortiert werden:

git config --global branch.sort -committerdate

Haftungsausschluss: Ich bin der Autor dieses Features in git. Ich habe es implementiert, als ich diese Frage sah.

9
user801247

Ich hatte das gleiche Problem, also schrieb ich einen Ruby-Edelstein namens Twig . Es listet die Zweige in chronologischer Reihenfolge (neueste zuerst) auf, und Sie können auch ein maximales Alter festlegen, damit Sie nicht alle Zweige auflisten (wenn Sie viele davon haben). Zum Beispiel:

$ 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

Sie können auch benutzerdefinierte Eigenschaften für jeden Zweig speichern, z. B. Ticket-ID, Status, Aufgaben und Filtern der Liste der Zweige nach diesen Eigenschaften. Weitere Informationen: http://rondevera.github.io/twig/

8
Ron DeVera

Ich habe den folgenden Befehl gefunden (für Git 2.13 und höher):

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

Wenn Sie keine column haben, können Sie die letzte Zeile durch ersetzen

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

Die Ausgabe sieht so aus

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

Ich schrieb einen Blogbeitrag darüber, wie die verschiedenen Teile funktionieren.

8
bdesham

Zu Ihrer Information, wenn Sie eine Liste der ausgecheckten Zweige (im Gegensatz zu kürzlich festgeschriebenen) erhalten möchten, können Sie gitts reflog verwenden:

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

Siehe auch: Wie erhalte ich eine Liste von Git-Zweigen, die ich kürzlich ausgecheckt habe?

7
Jordan Brough

Hier ist ein weiteres Skript, das alle anderen Skripts ausführt. Tatsächlich bietet es eine Funktion für Ihre Shell.

Sein Beitrag ist, dass es einige Farben aus Ihrer Git-Konfiguration zieht (oder Standardeinstellungen verwendet).

# 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
joeytwiddle

Hier ist ein kleines Skript, mit dem ich zwischen den letzten Branchen wechseln kann:

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

Verwenden Sie diese beiden Aliase

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

Rufen Sie das einfach in einem Git-Repo auf und es werden Ihnen die letzten N-Zweige (standardmäßig 10) und eine Zahl neben jedem angezeigt. Geben Sie die Nummer der Niederlassung ein und checkt aus:

 enter image description here

3
Agus Arias

Basierend auf der Version von ilius, aber der aktuelle Zweig ist mit einem Stern und in Farbe dargestellt und zeigt nur alles, was nicht als "Monate" oder "Jahre" bezeichnet wurde:

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
3
Mark Lodato

Mein bestes Ergebnis als Skript:

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
saeedgnu

Normalerweise betrachten wir kürzlich die entfernten Zweige. Also versuch das mal

git fetch
git for-each-ref --sort=-committerdate refs/remotes/Origin
1
Victor Choy

Spät zur Party hier. Die akzeptierte CML-Antwort rockt, aber wenn Sie etwas hübscheres wollen, wie eine GUI, und Ihr Origin === "github". 

Sie können im Repo auf "Branches" klicken. oder klicken Sie auf die URL direkt: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches

1
jahrichie

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

Für jeden, der daran interessiert ist, nur die Top-5-Zweignamen nach Datum des Committers zu sortieren. 

1
vardin

Hier ist die Variation, nach der ich gesucht habe:

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

Dieser tail -r kehrt die Liste um, so dass die zuletzt commiterdate zuletzt ist.

1
Ben

Ich weiß, dass es bereits viele Antworten gibt, aber hier sind meine zwei Cents für einen einfachen Alias ​​(ich möchte meinen neuesten Zweig ganz unten haben):

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

Dies gibt Ihnen einen schönen Überblick über Ihre letzten 15 Zweige in Farbe, wobei Ihr aktueller Zweig hervorgehoben ist (und er ein Sternchen hat).

1
Tom

Ich leite die Ausgabe aus der akzeptierten Antwort in dialog, um eine interaktive Liste zu erhalten:

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

Speichern Sie als (beispielsweise) ~/bin/git_recent_branches.sh und chmod +x es. Dann git config --global alias.rb '!git_recent_branches.sh', um mir einen neuen git rb-Befehl zu geben.

1
John Delaney

Git v2.19 führt die branch.sort config Option ein (siehe branch.sort ).

Daher sortiert git branch standardmäßig nach Committer-Datum (desc)

# gitconfig
[branch]
    sort = -committerdate     # desc

skript:

$ git config --global branch.sort -committerdate

Update:

So,

$ git branch
* dev
  master
  _

und

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
0
hIpPy

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))' das ist, was Sie brauchen

0
ChunkCoder