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?
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
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).
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
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-`
Où 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.
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
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.
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
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`
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.
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