Question Comment puis-je obtenir une liste des branches git, classées par commit le plus récent?


Je veux obtenir une liste de toutes les branches dans un dépôt Git avec les branches les plus «fraîches» en haut, où la branche «la plus fraîche» est celle qui a été la plus récemment engagée (et qui est donc plus susceptible d'être une Je veux faire attention à).

Est-ce que je peux utiliser Git pour (a) trier la liste des branches par le dernier commit, ou (b) obtenir une liste des branches avec la date de la dernière validation de chacun, dans un format lisible par une machine?

Dans le pire des cas, je pourrais toujours courir git branch pour obtenir une liste de toutes les branches, analyser sa sortie, puis git log -n 1 branchname --format=format:%ci pour chacun, pour obtenir la date de validation de chaque branche. Mais cela fonctionnera sur une machine Windows, où tourner un nouveau processus est relativement cher, donc lancer le git exécutable une fois par branche pourrait devenir lent s'il y a beaucoup de branches. Y a-t-il un moyen de faire tout cela avec une seule commande?


891
2018-03-04 00:26


origine


Réponses:


Utilisation --sort=-committerdate option de git for-each-ref;
  Aussi disponible depuis Git 2.7.0 pour git branch:

Utilisation de 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

Résultat:

result

Utilisation avancée

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

Résultat:

result


1220
2018-03-04 00:33



Liste des noms de branches git, classés par la plus récente ...

S'étendant sur la réponse de Jakub et le conseil de Joe, ce qui suit va supprimer le "refs / heads /" de sorte que la sortie n'affiche que les noms des branches:


Commander:

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

Résultat:

recent git branches


110
2018-05-12 01:21



Voici le code optimal, qui combine les deux autres réponses:

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

74
2018-05-21 23:22



Voici une commande simple qui liste toutes les branches avec les dernières validations:

git branch -v

Pour commander par commit le plus récent, utilisez

git branch -v --sort=committerdate

La source: http://git-scm.com/book/fr/Git-Branching-Branch-Management


64
2018-03-13 11:54



J'utilise l'alias suivant:

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"

qui produit: result

Edit: utilisez '|' séparer, grâce à @ Björn Lindqvist

Mise à jour: ajouté * avant la branche actuelle, grâce à @elhadi
Edit: correction d'un cas où la branche courante était une sous-chaîne d'une autre branche

Edit: utilisez une syntaxe plus simple pour la branche actuelle, grâce à @Joshua Skrzypek


36
2018-05-06 12:05



J'ai également eu besoin de couleurs, de tags et de références distantes sans aucun doublon:

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

Parce que citer peut être difficile, voici l'alias pour 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



Les autres réponses ne semblent pas permettre de passer -vv pour obtenir une sortie verbeuse.

Alors voici un one-liner qui trie git branch -vv par date de livraison, en conservant la couleur etc:

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

Si vous souhaitez également imprimer la date de validation, vous pouvez utiliser cette version à la place:

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-

Sortie de l'échantillon:

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

C'est probablement plus lisible divisé en plusieurs lignes:

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-

Cela devrait également fonctionner avec d'autres arguments git branch, par exemple. -vvr pour répertorier les branches de suivi à distance, ou -vva pour répertorier à la fois le suivi à distance et les branches locales.


22
2017-09-12 15:06