Vous voulez exclure un fichier de "git diff"

229

J'essaie d'exclure un fichier ( db/irrelevant.php) d'un diff Git. J'ai essayé de mettre un fichier dans le dbsous - répertoire appelé .gitattributesavec la ligne irrelevant.php -diff et j'ai également essayé de créer un fichier appelé .git/info/attributescontenant db/irrelevant.php.

Dans tous les cas, le db/irrelevant.phpfichier 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?

Michael
la source

Réponses:

325

Omg, pilotes et awk pour exclure un fichier moche? Depuis git 1.9, 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

Mr_and_Mrs_D
la source
4
REMARQUE: si vous souhaitez exclure un nom de fichier spécifique, vous devez préfixer avec un astérisque différent de la .gitignoresyntaxe du fichier. Par exemple :!*shrinkwrap.yamlau lieu de :!shrinkwrap.yaml.
vaughan
7
Exclure plus de fichiers, par exemple, j'ai des fichiers * .min.css et * .min.js à éviter du diff git. Donc, j'utilise la commandegit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare
4
syntaxe de Windows : git diff -- . ":(exclude)db/irrelevant.php"(guillemets doubles au lieu de guillemets simples)
cnlevy
4
Je vous remercie! Une telle syntaxe ésotérique .. Je dois la chercher à chaque fois.
Daniel Waltrip
1
@cnlevy ou sans guillemets! git diff -- . :(exclude)db/irrelevant.php
Matthias
62

Vous pouvez configurer un pilote diff personnalisé avec une commande no op et l'affecter 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.

(S'il /bin/truen'existe pas dans MacOS, les alternatives utiliseraient /usr/bin/trueou echo).

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

irrelevant.php    diff=nodiff

Si cet état est censé être partagé avec d' autres développeurs , vous pouvez utiliser au .gitattributeslieu de .git/info/attributespartager la git configcommande avec vos pairs (via un fichier de documentation ou quelque chose).

KurzedMetal
la source
2
C'est exactement ce que je cherchais - comme décrit dans kerneltrap.org/mailarchive/git/2008/10/17/3711254 J'ai édité ~ / .gitconfig en ajoutant: [diff "nodiff"] `command = / bin / true` et j'ai ensuite créé un fichier appelé .git / info / attributs dans lesquels j'ai ajouté: irrelevant.php diff=nodiff
Michael
12
Cette réponse a fonctionné beaucoup mieux pour moi: stackoverflow.com/questions/1016798/…
Neil Forrester
3
Fait intéressant, cette approche ne fonctionne pas git diff --stat. Dans ce cas, on pourrait utiliser git diff ... | diffstatcomme solution de contournement.
ddkilzer
@Michael ce lien semble être falsifié, y en a-t-il un autre?
DickieBoy
3
juste un ajout: si vous voulez forcer git diff à l'afficher quand même, utilisez--no-ext-diff
Florian Klein
35

Vous pouvez également utiliser filterdiff programme de la patchutils collection de programme visant à exclure certaines parties d'une diff. Par exemple:

git diff | filterdiff -p 1 -x db/irrelevant.php
Szilárd Pfeiffer
la source
4
Notez que -p, à partir de la page de manuel (1), est "-pn, --strip-match = n Lors de la correspondance, ignorez les n premiers composants du chemin d'accès." Il m'a fallu un certain temps pour attraper qui -p 1enlevait la dbpièce du chemin du PO. Si vous souhaitez simplement spécifier un nom de fichier et ignorer toutes les possibilités de chemin / répertoire, vous pouvez utiliser -p 99.
Tyler Collier
32

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

Chiel ten Brinke
la source
N'oubliez pas que le filtre s'applique uniquement à tous les fichiers situés sous votre répertoire actuel.
Chiel ten Brinke
C'était la meilleure réponse. J'ai pu simplifier un peu plus: stackoverflow.com/a/58845608/3886183
dlsso
2
Je supprimerais la partie --stat, ou du moins expliquerais ce qu'elle fait, car aucune des autres réponses ne l'inclut.
mix3d
L'indicateur de statistiques vous montre les fichiers et leurs totaux diff, ce qui vous permet de vérifier facilement si le filtre a fonctionné comme vous le vouliez.
Chiel ten Brinke
17

Cette solution en 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.txtest le nom du fichier que vous souhaitez exclure, bien sûr.

Edit: crédit ksenzee pour la correction des fichiers supprimés cassant le diff.

Ben Roux
la source
J'essaie d'adapter votre doublure git diff --stat mastersans grand succès - pourriez-vous m'aider?
Mr_and_Mrs_D
13

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

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

l'ajout d'un .gitattributesfichier dans le répertoire où le fichier à ignorer git diffréside avec le contenu suivant:

file-not-to-diff.bin -diff

Cela permet toujours de git status"voir" si le fichier a changé. git diffverra également que le fichier a changé, mais il ne générera pas le fichier diff.

Cette .binextension du fichier dans l'exemple était délibérée. Je me rends compte que c'est le comportement par défaut de git pour les fichiers binaires, et qu'il ne nécessite pas de manipulation spéciale avec .gitattributes. Mais dans mon cas, ces fichiers ont été reconnus comme des fichiers texte par git et l'utilitaire "file" et cela a fait l'affaire.

user3589608
la source
11

Réponse la plus simple

git diff ':!db/irrelevant.php'

C'est juste ':!<path to file>'après votre commande diff. La commande diff peut être aussi compliquée que vous le souhaitez, et vous pouvez utiliser des caractères génériques comme *.min.jsou ajouter plusieurs exclusions (séparez les blocs entre les espaces) si vous le souhaitez.

dlsso
la source
5

Par rapport au répertoire racine git

git diff accepte une exclusion facultative

git diff -- ":(exclude)thingToExclude"

Vous voudrez peut-être ajouter des caractères génériques

git diff -- ":(exclude)*/thingToExclude/*"

Cibler des types de fichiers spécifiques

git diff -- ":(exclude)*/$1/*.png"

Ou déposez un petit script pour vos fichiers dot

Tels que .bash_profileou.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}
jasonleonhard
la source
cela ne fonctionne tout simplement pas pour moi, je n'ai pas de différence du tout, avec les deux syntaxes, en utilisant (exclure) ou!. J'ai git 2.21.0
Olivvv
Vous pouvez git diff soit les fichiers non ou les fichiers intermédiaires. Si vous les avez ajoutés, ils sont mis en scène. S'ils sont mis en scène, vous pouvez le faire. git diff --stagedJ'espère que cela vous aidera.
jasonleonhard
Syntaxiquement, que fait le colon?
Jonah
2

C'est très simple, vous pouvez exclure ce que vous voulez en utilisant les commandes Unix standard, ces commandes sont disponibles sous git bash même sous environnement Windows. L'exemple ci-dessous montre comment exclure diff pour les fichiers pom.xml, vérifiez d'abord diff pour ne masteriser que les noms de fichiers, puis utilisez 'grep -v' pour exclure les fichiers dont vous ne voulez pas, puis réexécutez diff pour master avec une liste pré-préparée:

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

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é 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
Chris Montoro
la source
1

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'elle ne peut parfois pas être utilisée (par exemple, si vous avez déjà mis en scène des choses), mais elle fait l'affaire sans avoir à taper une commande compliquée

BlueMagma
la source
0

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 courte commande facile à retenir.

Tout d'abord, configurez un outil de différenciation 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 différences (par fichier) dans Meld (ou l'outil de votre choix). N'ouvrez simplement pas le fichier que vous souhaitez ignorer.

mkasberg
la source