Vous voulez exclure le fichier de «git diff»

J’essaie d’exclure un fichier ( db/irrelevant.php ) d’un diff Git. J’ai essayé de mettre un fichier dans le sous-répertoire db appelé .gitatsortingbutes avec la ligne irrelevant.php -diff et j’ai aussi essayé de créer un fichier appelé .git/info/atsortingbutes contenant db/irrelevant.php .

Dans tous les cas, le fichier db/irrelevant.php est inclus dans le diff en tant que patch binary Git. Ce que je veux, c’est que les modifications apscopes à ce fichier soient ignorées par la commande diff. Qu’est-ce que je fais mal?

Omg, pilotes et awk pour exclure un fichier moche? Depuis git 1.9, vous pouvez:

 git diff -- . ':(exclude)db/irrelevant.php' 

Ah, l’élégance! Voir la réponse citée et pour plus de détails cette réponse par @torek

Vous pouvez configurer un pilote de diff personnalisé avec une commande no op et l’assigner aux fichiers à ignorer.

Créez un pilote diff spécifique au référentiel avec cette commande

 git config diff.nodiff.command /bin/true 

ou pour tous vos repos avec --global .

(Si /bin/true n’existe pas dans MacOS, les alternatives consisteraient à utiliser /usr/bin/true ou echo ).

Ensuite, atsortingbuez le nouveau pilote diff aux fichiers que vous souhaitez ignorer dans votre .git/info/atsortingbutes .

 irrelevant.php diff=nodiff 

Si cet état est censé être partagé avec d’autres développeurs, vous pouvez utiliser .gitatsortingbutes au lieu de .git/info/atsortingbutes et partager la commande git config avec vos pairs (via un fichier de documentation ou autre).

Vous pouvez également utiliser le programme filterdiff de la collection de programmes patchutils pour exclure certaines parties d’un diff. Par exemple:

 git diff | filterdiff -p 1 -x db/irrelevant.php 

Cette solution en une ligne ne nécessite aucun autre utilitaire / téléchargement:

 git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-` 

file/to/exclude.txt est le nom du fichier que vous souhaitez exclure, bien sûr.

Edit: crédit ksenzee pour la fixation des fichiers supprimés en brisant le diff.

Cette méthode est plus courte que la méthode acceptée.

 git diff 987200fbfb 878cee40ba --stat -- ':!*.cs' 

Pour plus d’informations sur les différentes possibilités d’inclusion / exclusion, lisez cet autre article

similaire à la solution de Ben Roux , mais partageant quand même:

 git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff 

ou, si les modifications ont déjà été commises localement:

 git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master 

Exemples:

 git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master git diff --name-only origin/master | grep -v docs | xargs git diff origin/master 

Si vous voulez faire cela uniquement pour inspecter visuellement le diff, un outil de diff visuel (comme Meld ) vous permettra de le faire avec une commande courte facile à mémoriser.

Tout d’abord, configurez un outil de diff si vous ne l’avez pas déjà fait.

 $ git config --global diff.tool = meld 

Ensuite, vous pouvez exécuter un répertoire diff.

 $ git difftool --dir-diff 

Vous pourrez parcourir les diffs (par fichier) dans Meld (ou votre outil de choix). N’ouvrez simplement pas le fichier que vous voulez ignorer.