Coup de balai : déblayer les branches d'un repo Git

Comme je vous l'indiquais dans un précédent article, chez Siine, nous hébergeons nos projets sur GitHub, et chaque User Story fait l’objet d’une branche dédiée.

Lorsqu'une branche qui a fait l'objet d'une pull request est validée, elle est mergée sur la branche d'intégration. Nous n'avons cependant pas pris l'habitude de supprimer ces branches une fois mergées. Je pense que nous aurions probablement du les supprimer au fur et à mesure, car nous nous retrouvons aujourd'hui avec de nombreuses branches mergées, qui ne servent à rien et qui polluent nos repository.

Branches konary by Krzysztof

Notez que GitHub conserve l'historique des pull request même quand les branches sont supprimées. Je ne vois vraiment aucune raison de conserver des branches mergées. Et vous ?

Quoi qu'il en soit, il est tout à fait possible de corriger cela, en quelques commandes Git bien senties.

On récupère toutes les données du repository remote

git fetch --all

On supprime de notre repository local toutes les branches remote qui n'existent plus

git remote prune origin

Valor prune by Glysiak

On compte toutes les branches remote mergées :

git branch -r --merged origin/integration | wc -l

Le paramètre -r signifie remote, et --merged origin/integration permet de lister les branches mergées dans origin/integration.

Vous l'aurez noté, wc -l est une commande Unix permettant de compter le nombre de lignes du flux d'entrée. Ainsi, on pourrait l'utiliser pour compter le nombre de branches du repository remote :

git branch -r | wc -l

Il n'y a plus qu'à supprimer les branches mergées :

# Supprimer la branche sur le remote
git push origin :my_branch
# Et supprimer la branche qui la track en local
git branch -d my_branch

Notez aussi que GitHub met à disposition ce listing sans avoir à entrer une seule ligne de commande, en cliquant sur Branches.

Pour finir : si lister les branches mergées permet de faire le ménage, à l'inverse il peut être intéressant de prendre connaissance des branches non mergées, car il se peut que certaines d'entre elles aient été oubliées et soient à l'abandon. Pour cela, rien de plus simple :

git branch -r --no-merged origin/integration

Comments

Dvins

Salut Piwai ! Cet historique des branches supprimées est-il propre à Github ou est-ce inclus de base dans Git ? J’utilise Git depuis peu (ASI = SVN comme tu le sais) et je commence en effet à me retrouver avec un tas de branches mergées qui polluent le dépôt ! Merci d’avance !

Piwaï

Salut Dvins!

Github conserve l’historique des “pull request”, pas des “branches supprimées”. Il n’y a pas de notion “d’historique des branches supprimées” dans git. Les branches, tout comme les tags, sont de simples marqueurs sur un graphe, qui identifient des commits particuliers.

Supprimer une branche, c’est supprimer un marqueur, ni plus ni moins .

Par ailleurs, effectivement, les commandes que je donne ici sont des commandes Git, et donc fonctionnent sur n’importe quel repo git.