Tilap.net

Développement web

Git

Git, successeur de Subversion en tant que gestionnaire de versionning.

Git: hook pre-commit bête et pratique

Une très courte note sur un hook de pré commit rapide, simple.

Dans l’exemple de code ci-dessous très facilement adaptable, il est impossible de commiter si dans votre code source (répertoire src) vous avez des console.log. En principe ils ne sont utilisés que pour du debug (rappel: il y a aussi console.info(), console.error(), et même console.dir… mais veillez quand même à jeter un œil sur la compatibilité de certaines méthodes de console si vous les utilisez dans votre navigateur).

grep -Rq 'console.log' src && echo 'Commit aborted: there are "console.log" in the source code!' && exit 1

C’est bien sûr à mettre dans votre fichier ./git/hooks/pre-commit, de préférence le plus haut (en fonction de ce que vous pouvez avoir d’autre dans votre hook).

Git push hook pour éviter de pusher sur master ou avoir un message de confirmation pour certaines branches

Voici un petit hook github qui s’exécute à chaque fois que vous ferez un git push et qui :
– vous empêchera de faire des push force sur certaines branches ;
– vous empêchera de faire des push sur certaines branches ;
– vous demandera confirmation pour d’autres branches ;
– laissera le comportement par défaut pour les branches non spécifiées.

Ce hook permet par exemple de ne pas pusher sur la branch master (faites des pull requests !) ou bien de vous demander confirmation quand vous pushez sur des branches un peu sensibles.

Installation

Copiez le code ci-après dans .git/hooks/pre-push de votre projet. Rendez le exécutable avec

chmod +x .git/hooks/pre-push

Vous pouvez ensuite modifier les variables :
NOPUSHFORCE_BRANCHES_PATTERN, liste des branches pour lesquelles le push force ne sera plus possible
NOPUSH_BRANCHES_PATTERN, liste des branches pour lesquelles le push ne sera plus possible
CONFIRM_BRANCH_PATTERN, les branches pour lesquelles on vous demandera confirmation.

Le code du Hook

#!/bin/bash
## CONFIG
# Pattern of branch name you won't be allowed to push force
NOPUSHFORCE_BRANCHES_PATTERN="^(dev|release-*|patch-*)"
# Pattern of branch name you won't be allowed to push
NOPUSH_BRANCHES_PATTERN="^(master)"
# Pattern of branch name that will ask to confirm before pushing
CONFIRM_BRANCH_PATTERN="^(master|production)"
## VARS
FORCE_PUSH_PATTERN="force|delete|-f"
CURRENT_BRANCH=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
PUSH_COMMAND=`ps -ocommand= -p $PPID`
## Deny push force
if [[ "$CURRENT_BRANCH" =~ $NOPUSHFORCE_BRANCHES_PATTERN && "$PUSH_COMMAND" =~ $FORCE_PUSH_PATTERN ]]; then
echo "Pre-push hook: push force on branch \"$CURRENT_BRANCH\" is not allowed"
exit 1
fi
## Deny push
if [[ "$CURRENT_BRANCH" =~ $NOPUSH_BRANCHES_PATTERN ]]; then
echo "Pre-push hook: push on branch \"$CURRENT_BRANCH\" is not allowed"
exit 1
fi
## Ask confirmation
if [[ "$CURRENT_BRANCH" =~ $CONFIRM_BRANCH_PATTERN ]]
then
read -p "You're about to push on \"$CURRENT_BRANCH\". Are you really sure? [Y|n] " -n 1 -r < /dev/tty echo if echo $REPLY | grep -E '^[YyOo]$' > /dev/null ; then
exit 0
else
exit 1
fi
fi
exit 0

Le code est aussi disponible sur Gist.

Git stash cheatsheet

Git stash permet de mettre de coté des fichiers en cours de modification et de les récupérer en l’état plus tard. Ce « stash » peut être réalisé plusieurs fois et on a donc une « pile » de stash ayant chacun un identifiant. Ca devient vite indispensable quand on a besoin de faire un rebase, un checkout ou un merge.

Récapitulatif des commandes à retenir pour git stash :

Mettre de coté les fichiers en cours de modification

git stash

Lister les stashs :

git stash list

Récupérer les derniers fichiers :

git stash apply

Récupérer les derniers fichiers et supprimer le stash :

git stash pop

Récupérer les fichiers d’un stash en particulier :

git stash apply stash@{0}

Supprimer un stash :

git stash drop stash@{0}

Voir les détails d’un stash :

git stash show stash@{0}

Créer une nouvelle branche à partir d’un stash :

git stash branch stash@{0}

Dans les exemples ci dessus, stash@{0}indique un stash précis de la pile (où 0 peut prendre d’autres valeurs numériques). Utiliser la commande git stash listpour visualiser ces identifiants.

Git: se souvenir du login et mot de passe

Lorsque vous utilisez git sur des remotes distants, vous devez vous authentifier. Le mieux étant de partager votre clé SSH.

Si vous ne pouvez pas le faire, vous pouvez éviter d’avoir à saisir vos login/mot de passe à chaque commande git, en utilisant le credential storage.

Pour activer cette feature, tapez :

git config credential.helper cache

A votre prochaine action nécessitant de s’authentifier, git se souviendra de vos identifiants.Pour qu’il ne s’en souvienne que pour une durée limitée (temps en secondes) :

git config credential.helper 'cache --timeout=3600'

Et si vous souhaitez qu’il oublie le login/mot de passe avant le délai d’expiration, il suffit de tuer le démon avec :

git credential-cache exit

Git et bash : un raccourci pour feignant

Un petit alias bash à mettre dans votre .bashrc (ou .bash_alias, ou autre) pour avoir un aperçu rapide lorsque vous êtes dans un répertoire git :

alias gith='echo "=== Remote ===" && git remote -v && echo "" && echo "=== Branch ===" && git branch -v && echo "" && echo "=== Latest commits ===" && git log --pretty="%cr (%cn) %s" -n 15 --date=relative'

Ceci affichera un résumé des remotes, branches et 15 derniers logs du répertoire git sur lequel vous êtes.
Ca ne casse pas 3 pattes à un canard, mais c’est toujours bon à utiliser.

Git : trouver et lister les fichiers modifiés par un utilisateur

Sous git, on a parfois besoin d’avoir la liste des fichiers modifiés par un utilisateur (perte de mémoire, packaging spécifique, mettre en valeur un contributeur ou une contribution, ou… fliquer pour les plus mauvais).

Voilà qui :

  • liste les commits git d’un auteur (git log) ;
  • récupère la liste des fichiers modifiés (show –oneline –name-only $commit_hash) lors de chacun de ces commits (while read commit_hash) ;
  • Affiche le fichier modifié (tail -n+2) en les ordonnant par nom et de façon unique (| sort | uniq)
git log --pretty="%H" --author="julien" | while read commit_hash; do git show --oneline --name-only $commit_hash | tail -n+2; done | sort | uniq

Il ne vous reste plus qu’à utiliser les alias git pour utiliser facilement cette ligne de commande, quitte à la personnaliser (logs de julien les 24 dernières heures par exemple). Pour l’alias, petit rappel :

git config alias.nomdelalias 'commande-a-executer'

et vous pourrez ensuite utiliser

git nomdelalias

Git : des logs lisibles, avec arborescence et en couleur

Lire les logs de git avec la commande git log est une action assez systématique lorsque l’on travaille avec ce gestionnaire de versions.

Néanmoins, reconnaissons le, si c’est pratique, il devient vite chiant usant de remonter dans l’historique, et la vue n’est pas très synthétique.

Pour profiter d’une lecture des logs plus rapide, je vous propose la commande suivante bien pratique, que vous pourrez personnaliser à votre bon gré. Elle affiche chaque log sur une seule ligne, avec des couleurs, permettant une lecture beaucoup plus rapide

Lire la suite »

Git : annuler proprement des commits après un push

Avec git, il arrive que l’on veuille annuler des commits faits mais que, malheureusement, on les a déjà propagé avec git push.

Plusieurs méthodes existent, vous trouverez des tas de solutions plus ou moins claires sur Google. Néanmoins, la plus propre reste l’application d’un revert, puis d’un nouveau push. Ceci permet de garder trace de votre annulation, explicitant ainsi aux autres membres du projet ce qui s’est passé (ou à vous même de vous rappeller pourquoi si vous travaillez seul).

Annuler un commit en particulier déjà pushé

Dans un premier temps, vous récupérer l’id du commit à annuler, par exemple en consultant les logs :

git log

Puis, vous annulez le commit en question proprement :

git revert XXX

ou XXX est l’id du commit à annuler.
Puis vous pushez proprement avec

git push

Annuler les N derniers commits déjà pushés

La même méthode est employée, mais vous pouvez utiliser la commande suivante qui annulera par exemple les 5 derniers commits. Il vous restera alors à pusher proprement.

git revert HEAD~5

Git : les commandes usuelles à connaitre

Git est un outil de gestion de ressources fabuleux, qui détronera un jour ou l’autre les vieux CVS ou SVN (quoique c’est peut être déjà le cas…). En attendant, voici une petite liste des commandes utiles, pour ceux débutant avec ou bien qui, comme moi, on des trous de mémoire régulièrement.

De l’installation à l’utilisation en passant par la configuration, tout l’essentiel sur les commit, push, branchs, tags et autres choses à ne pas oublier.

Lire la suite »

X