web-dev-qa-db-fra.com

Comment dire à git d’ignorer des lignes individuelles, c’est-à-dire gitignore pour des lignes de code spécifiques

.gitignore peut ignorer des fichiers entiers, mais existe-t-il un moyen d'ignorer des lignes de code spécifiques lors du codage?

J'ajoute fréquemment et à plusieurs reprises les mêmes lignes de débogage dans un projet, seulement pour me rappeler de les supprimer avant de valider. Je voudrais juste garder les lignes dans le code et les ignorer.

144
Kache

Voici comment vous pouvez le faire avec filtres git :

  1. Créer/Ouvrir un fichier gitattributes:
    • <project root>/.gitattributes (Sera engagé dans le repo)
      OU
    • <project root>/.git/info/attributes (Ne sera pas validé dans le repo)
  2. Ajoutez une ligne définissant les fichiers à filtrer:
    • *.rb filter=gitignore, C’est-à-dire un filtre appelé gitignore sur tous les fichiers *.rb
  3. Définissez le filtre gitignore dans votre gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", C’est-à-dire supprimer ces lignes
    • $ git config --global filter.gitignore.smudge cat, C’est-à-dire ne rien faire lors de l'extraction d'un fichier depuis le dépôt

Remarques:
Bien sûr, cela concerne les fichiers Ruby, appliqués quand une ligne se termine par #gitignore, Appliqués globalement dans ~/.gitconfig. Modifiez cela comme vous le souhaitez besoin pour vos buts.

Attention!!
Cela laisse votre fichier de travail différent du repo (bien sûr). Toute vérification ou changement de base signifiera que ces lignes seront perdues! Cette astuce peut sembler inutile puisque ces lignes sont régulièrement perdues lors du check-out, du rebase ou du pull, mais j'ai un cas d'utilisation spécifique pour pouvoir l'utiliser.

Juste git stash save "proj1-debug" lorsque le filtre est inactif (désactivez-le temporairement dans gitconfig ou quelque chose du genre). De cette façon, mon code de débogage peut toujours être git stash apply 'Ajouté à mon code à tout moment, sans craindre que ces lignes ne soient jamais validées par accident.

J'ai une idée possible pour traiter ces problèmes, mais j'essaierai de la mettre en œuvre une autre fois.

Merci à Rudi et jw013 pour avoir mentionné les filtres et les gitattributes git.

127
Kache

J'ai eu un problème similaire en écrivant Java. Ma solution consistait à baliser le code que je ne voulais pas valider, puis à ajouter un crochet de pré-validation qui rechercherait mon balisage:

#!/bin/bash
#
# This hook will look for code comments marked '//no-commit'
#    - case-insensitive
#    - dash is optional
#    - there may be a space after the //
#
noCommitCount=$(git diff --no-ext-diff --cached | egrep -i --count "(@No|\/\/\s?no[ -]?)commit")
if [ "$noCommitCount" -ne "0" ]; then
   echo "WARNING: You are attempting to commit changes which include a 'no-commit'."
   echo "Please check the following files:"
   git diff --no-ext-diff --cached --name-only -i -G"(@no|\/\/s?no-?)commit" | sed 's/^/   - /'
   echo
   echo "You can ignore this warning by running the commit command with '--no-verify'"
   exit 1
fi
21
Mike