web-dev-qa-db-fra.com

Veut 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é .gitattributes avec la ligne irrelevant.php -diff.__ et j'ai également essayé de créer un fichier appelé .git/info/attributes contenant db/irrelevant.php

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

155
Michael

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

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

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

212
Mr_and_Mrs_D

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

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

git config diff.nodiff.command /bin/true

ou pour tous vos dépôts avec --global.

(Si /bin/true n’existe pas sous MacOS, des alternatives utiliseraient /usr/bin/true ou echo).

Ensuite, assignez le nouveau pilote de diff aux fichiers que vous souhaitez ignorer dans votre fichier .git/info/attributes.

irrelevant.php    diff=nodiff

Si cet état est censé être partagé avec d'autres développeurs, vous pouvez utiliser .gitattributes au lieu de .git/info/attributes et partager la commande git config avec vos pairs (via un fichier de documentation ou quelque chose de ce genre).

59
KurzedMetal

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

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

Cette solution en une seule 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: credit ksenzee pour la réparation de fichiers supprimés brisant le diff.

17
Ben Roux

Cette méthode est plus courte que les réponses acceptées.

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

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

13
Chiel ten Brinke

Vraiment bonne réponse de KurzedMetal pour ce que je devais faire, à savoir la capacité de voir que le fichier avait changé, mais pas de générer le diff, qui aurait pu être énorme, dans mon cas.

Mais un de mes collègues a suggéré une approche encore plus simple et efficace pour moi: 

ajout du fichier .gitattributes dans le répertoire où se trouve le fichier à ignorer par git diff avec le contenu suivant:

file-not-to-diff.bin -diff

Cela laisse quand même git status "voir" si le fichier a changé. git diff "verra" également que le fichier a changé, mais ne générera pas la diff.

Cette extension .bin pour le fichier dans l'exemple était délibérée. Je réalise que c'est le comportement par défaut de git pour les fichiers binaires et qu'il ne nécessite pas de traitement spécial avec .gitattributes. Mais dans mon cas, ces fichiers ont été reconnus en tant que fichiers texte par git et l'utilitaire "fichier", ce qui a permis de faire l'affaire.

5
user3589608

semblable à de Ben Roux solution, mais partage 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é validées 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
1
Chris Montoro

C’est très simple, vous pouvez exclure ce que vous voulez en utilisant des commandes unix standard, ces commandes sont disponibles sous git bash même sous un environnement Windows. L'exemple ci-dessous montre comment exclure les diff pour les fichiers pom.xml. Commencez par vérifier diff pour maîtriser les noms de fichiers, puis utilisez 'grep -v' pour exclure les fichiers que vous ne voulez pas, puis relancez diff pour maîtriser avec la liste prepapred:

git diff master `git diff --name-only master | grep -v pom.xml`
1
Nieznany Anonimiec

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 à retenir.

Commencez par configurer 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). Il suffit simplement de ne pas ouvrir le fichier que vous souhaitez ignorer.

0
mkasberg

Je fais ce qui suit:

git add *pattern_to_exclude*
git diff
git reset HEAD .

Je sais que ce n’est pas une solution élégante et qu’il est parfois impossible de l’utiliser (par exemple, si vous avez déjà mis en scène des éléments), mais cela ne nécessite pas de taper une commande compliquée

0
BlueMagma