53 votes

Un git crochet à chaque fois que je change les branches?

Voici donc une situation intéressante lors de l'utilisation de git et de python, et je suis sûr que cela arrive pour d'autres situations.

Disons que je fais un repo git avec un dossier /toto/. Dans ce dossier j'ai mis /foo/program.py. - Je exécuter program.py et le programme.pyc est créé. J'ai *.pyc dans le .gitignore fichier, de sorte que git n'a pas le suivre.

Maintenant, disons que je fais une autre branche, dev. Dans cette branche dev, j'ai supprimer le /foo/ dossier entièrement.

Maintenant je passe à la branche principale, et /foo/ réapparaît. Je lance le program.py et le programme.pyc fichier réapparaît. Tout est bien.

- Je revenir à ma branche dev. Le répertoire /foo/ devraient disparaître. Il n'existe que dans la branche master, pas de la branche dev. Cependant, il est toujours là. Pourquoi? Parce que le ignorés programme.pyc fichier empêche le dossier supprimé lors de la commutation de branches.

La solution à ce problème est de supprimer de manière récursive tous les *.pyc fichiers avant de passer les branches. Je peux le faire facilement avec cette commande.

find . -name "*.pyc" -exec rm '{}' ';'

Le problème est qu'il est ennuyeux d'avoir à vous rappeler de le faire cela presque à chaque fois que je change les branches. J'ai pu faire un alias pour cette commande, mais je dois encore n'oubliez pas de taper à chaque fois que je change les branches. Je pourrais aussi faire un alias pour la commande git-branche, mais ce n'est pas bon non plus. La commande git branch fait d'autres choses d'ailleurs il suffit de changer les branches, et je ne veux pas supprimer tous les pyc fichiers chaque fois que je l'utilise. Zut, je pourrais même l'utiliser dans un non-python pensions, alors quoi?

Est-il un moyen de définir un git crochet qui s'exécute seulement quand je change de branches? Ou est-il un autre moyen de régler tous *.pyc des fichiers effacés à chaque fois que je changer de branches?

41voto

Jefromi Points 127932

Il y a un post-checkout crochet, pour être placé .git/hooks/post-extraction. Il y a probablement un modèle, il y a, éventuellement nommé .de l'échantillon ou peut-être pas exécutable, selon votre version git. Courte description: il obtient trois paramètres, le précédent CHEF, le nouveau CHEF, et un drapeau qui est à 1 si la direction a changé et 0 si c'était simplement un fichier de la caisse. Voir man githooks pour plus d'informations! Vous devriez être en mesure d'écrire un script shell pour faire ce que vous avez besoin et de le mettre là.

Edit: je me rends compte que vous êtes à la recherche pour ce faire pré-caisse, de sorte que la caisse nettoie automatiquement les répertoires qui se vide. Il n'y a pas de pré-caisse crochet, cependant, de sorte que vous aurez à utiliser votre script pour supprimer les répertoires.

Une autre remarque: Les alias sont une partie de gitconfig, qui peuvent être locales à un référentiel (en .git/config, pas ~/.gitconfig). Si vous choisissez de le faire avec des alias (pour git-caisse, pas git-direction de), vous pouvez facilement mettre en python dépôts. Dans ce cas également, je voudrais faire un alias spécifiquement à cette fin (par exemple, cc pour la caisse propre). Vous pouvez toujours utiliser la caisse (ou d'un autre alias forme de celui-ci) si vous ne voulez pas nettoyer pyc fichiers.

36voto

Christian Oudard Points 13461

Simplement copier et de mettre à jour une bonne solution par Apreche qui a été enterré dans les commentaires:

Enregistrez ce script shell pour le fichier /path/to/repo/.git/hooks/post-checkout, et le rendre exécutable.

#! /bin/sh

# Start from the repository root.
cd ./$(git rev-parse --show-cdup)

# Delete .pyc files and empty directories.
find . -name "*.pyc" -delete
find . -type d -empty -delete

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