1944 votes

Comment puis-je obtenir une liste des branches de Git, classée par le plus récent commit ?

Je veux obtenir une liste de toutes les branches d'un dépôt Git avec les branches les plus récentes en haut, où la branche la plus récente est celle qui a été commise le plus récemment (et est donc plus susceptible d'être celle à laquelle je veux prêter attention).

Existe-t-il un moyen d'utiliser Git pour (a) trier la liste des branches par dernier commit, ou (b) obtenir une liste des branches avec la date du dernier commit de chacune d'elles, 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, et ensuite git log -n 1 branchname --format=format:%ci pour chacune d'entre elles, pour obtenir la date de livraison de chaque branche. Mais cela fonctionnera sur une machine Windows, où la création d'un nouveau processus est relativement coûteuse, donc lancer l'exécutable Git une fois par branche pourrait être lent s'il y a beaucoup de branches. Existe-t-il un moyen de faire tout cela avec une seule commande ?

3 votes

stackoverflow.com/a/2514279/1804124 A une meilleure réponse.

18 votes

@Spundun, vous m'avez perdu là. En quoi une combinaison de plusieurs commandes, y compris des choses passées par perl et sed, est-elle "meilleure" que l'utilisation d'une commande que Git possède déjà ?

1 votes

Parce qu'avec la réponse ici, je n'ai pas obtenu toutes les branches dans le repo. Dans mon cas particulier, la réponse me donnait une branche et la réponse ici me donnait une vingtaine de branches (avec l'option -r).

2728voto

Jakub Narębski Points 87537

Utilisez le --sort=-committerdate option de git for-each-ref ;

Également disponible depuis Git 2.7.0 para 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

Pro Usage (Unix) :

Vous pouvez placer l'extrait suivant dans votre fichier ~/.gitconfig . L'alias recentb accepte deux arguments :

  • refbranch quelle branche le en avant y derrière sont calculées par rapport à ces colonnes. Valeur par défaut maître
  • count : combien de branches récentes à afficher. Par défaut 20

    [alias]

    ATTENTION: All aliases prefixed with ! run in /bin/sh make sure you use sh syntax, not bash/zsh or whatever

    recentb = "!r() { refbranch=$1 count=$2; git for-each-ref --sort=-committerdate refs/heads --format='%(refname:short)|%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:-20} | while read line; do branch=$(echo \"$line\" | awk 'BEGIN { FS = \"|\" }; { print $1 }' | tr -d '*'); ahead=$(git rev-list --count \"${refbranch:-origin/master}..${branch}\"); behind=$(git rev-list --count \"${branch}..${refbranch:-origin/master}\"); colorline=$(echo \"$line\" | sed 's/^[^|]*|//'); echo \"$ahead|$behind|$colorline\" | awk -F'|' -vOFS='|' '{$5=substr($5,1,70)}1' ; done | ( echo \"ahead|behind||branch|lastcommit|message|author\\n\" && cat) | column -ts'|';}; r"

Résultat :

Recentb alias result

17 votes

Parfait ! Je peux même restreindre la sortie aux seuls noms des références en ajoutant le texte suivant --format=%(refname) .

40 votes

C'est mieux pour moi : git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'

3 votes

@ilius : pourquoi ne pas utiliser :shortname ?

161voto

Beau Smith Points 8112

Liste des noms de branches Git, ordonnée par le commit le plus récent

_Élargir le champ d'action La réponse de Jakub y Le conseil de Joe le texte suivant supprimera les "refs/heads/" pour que la sortie n'affiche que les noms des branches :_


Commandement :

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

Résultat :

Recent Git branches

4 votes

Vous pouvez également utiliser --format=%(refname:short) au lieu de s'appuyer sur cut .

9 votes

Y a-t-il un moyen de faire cela pour le référentiel REMOTE ?

15 votes

Aah - @jakub.g a déjà expliqué : vous pouvez obtenir des branches distantes en passant par refs/remotes/ au lieu de refs/heads/. Parfait !

151voto

user1682406 Points 391

Voici une commande simple qui liste toutes les branches avec les derniers commits :

git branch -v

Pour commander par ordre d'engagement le plus récent, utilisez

git branch -v --sort=committerdate

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

20 votes

git branch -av si vous voulez voir les branches non-locales aussi.

8 votes

Est-il facile d'obtenir git branch -v pour inclure la date de chaque livraison listée ?

9 votes

C'est génial. J'aime git branch -va --sort=-committerdate pour afficher les branches non-locales, avec les branches les plus récemment modifiées en haut.

102voto

nikolay Points 601

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

11 votes

Même un peu plus optimisé pour obtenir une sortie tabulaire : git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'

5 votes

Pour une raison quelconque, j'ai dû utiliser des guillemets sous Windows, mais sinon, cela fonctionne très bien :)

1 votes

@schoetbi Ce code ressemble exactement à celui de nikolay, qu'avez-vous changé pour le rendre tabulaire ?

43voto

estani Points 1167

J'avais également besoin de couleurs, de balises 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 la citation 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'"]++'"

0 votes

$ <votre commande ici> awk : erreur de syntaxe près de la ligne 1 awk : abandon près de la ligne 1

0 votes

@GotNoSugarBaby Vous utilisez des guillemets simples comme dans l'exemple, n'est-ce pas ? Quel shell utilisez-vous ? Bash donne à ce caractère une signification spéciale sinon.

0 votes

Hey, j'ai exécuté ce programme sur /bin/bash (GNU bash, version 4.0.28(1)-release (i386-pc-solaris2.11)) avec un simple copier-coller de votre exemple - mais depuis, je l'ai exécuté sur /bin/bash (GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)) et il fonctionne, donc je vais retirer le vote négatif. Merci beaucoup Estani.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X