Question Comment lister uniquement les branches actives / récemment modifiées dans git?


Je travaille parfois avec des référentiels de code source contenant de nombreuses branches, dont la plupart sont anciennes et ne sont généralement plus pertinentes.

Dans ces cas, la liste complète des branches de git branch n'est pas très utile. Est-il possible de ne lister que les branches "actives"? Par exemple, seules les branches ayant reçu un commit dans le dernier n journées? Idéalement, la liste doit inclure la dernière date de validation pour chaque branche et indiquer si la branche est déjà entièrement fusionnée.

P.S .: Je me rends compte que cela peut également être résolu en supprimant les "anciennes" branches (comme discuté par exemple dans Que faire avec des branches expérimentales non fusionnées? ), mais cela peut ne pas toujours être pratique ou accepté sur un projet donné.


22
2018-06-21 09:16


origine


Réponses:


Vous pouvez utiliser git-pour-chaque-ref pour obtenir une liste de toutes les branches locales et de suivi triées par ordre décroissant de la date de mise en service de la dernière validation comme ceci:

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

Ceci produit par exemple:

2012-06-23 refs/heads/master
2012-06-21 refs/remotes/origin/HEAD
2012-06-21 refs/remotes/origin/master

Vous pouvez ajouter --count=m au maximum m branches, vous pouvez --sort=-authordate au lieu d'utiliser la date du committer, vous pouvez bien entendu utiliser différents formats. for-each-ref lui-même ne limite pas le résultat par date, cela doit être scripté séparément, mais au moins vous avez les dates de l'objet de validation en main.


27
2018-06-21 18:17



ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done;

Cette oneliner imprime toutes les branches locales triées par heure du plus récent au plus ancien. Chaque branche a été validée en dernier avec une chaîne de date lisible par l'homme. Vous pouvez l'ajouter à votre .gitconfig.

Pour les succursales distantes, j'ai trouvé cette solution effrayante:

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $( echo $b | cut -d' ' -f1 ) --; done | sort -rn -k1,10 | cut -c11-

Modifier: plus je pense, plus je crains que cela ne soit pas fiable, parce que ls-remote se connecte toujours à côté distant alors que log ne pas. Il peut être nécessaire de faire fetch avant chaque exécution de cette commande.


7
2018-06-21 09:42