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?
Verwenden Sie die Option --sort=-committerdate
von git for-each-ref
;
Auch verfügbar seit Git 2.7.0 für git branch
:
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
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))'
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:
git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'
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)'
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
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:
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
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'"]++'"
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)) '
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.
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äfixesrefs/...
) 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.
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)$|$"
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"
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.
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/
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.
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?
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}"
}
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:
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
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
Normalerweise betrachten wir kürzlich die entfernten Zweige. Also versuch das mal
git fetch
git for-each-ref --sort=-committerdate refs/remotes/Origin
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
git branch --sort=-committerdate | head -5
Für jeden, der daran interessiert ist, nur die Top-5-Zweignamen nach Datum des Committers zu sortieren.
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.
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).
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.
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
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