git difftool, ouvre immédiatement tous les fichiers diff, pas en série


240

Le comportement par défaut de git diff est d'ouvrir chaque fichier diff en série (attendez que le fichier précédent soit fermé avant d'ouvrir le fichier suivant).

Je cherche un moyen d'ouvrir tous les fichiers à la fois - dans BeyondCompare par exemple, cela ouvrirait tous les fichiers dans des onglets dans la même fenêtre BC.

Cela faciliterait l'examen d'un ensemble complexe de changements; feuilletez d'avant en arrière entre les fichiers diff et ignorez les fichiers sans importance.


"git diff" ou "git difftool"? Vous voudrez peut-être publier une demande sur (ouverte à tous et avec une interface Web varous) liste de diffusion git: git@vger.kernel.org
Jakub Narębski

J'utilise "git difftool" pour déclencher l'application diff externe. Merci pour l'idée de la liste de diffusion.
Seba Illingworth

Il serait utile de connaître la plateforme. Sur une plate-forme basée sur Unix, j'écrirais un script pour effectuer la différence et demanderais à git d'utiliser ce script. Dans le script, j'exécutais simplement le diff en arrière-plan, puis je laissais le script mourir.
Chris Cleeland

Plateforme Windows, mais merci pour les idées Chris.
Seba Illingworth

Réponses:


214

À partir de la version git1.7.11, vous pouvez utiliser git difftool --dir-diffpour effectuer une différence de répertoire.

Cette fonctionnalité fonctionne bien avec Meld 3.14.2 par exemple, et vous permet de parcourir tous les fichiers modifiés:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Il s'agit d'une fonction Bash pratique:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

La réponse qui suit s'applique aux gitinstallations antérieures à la v1.7.11.


Cette même question a été posée sur la liste de diffusion git .

J'ai mis en place un script shell basé sur ce fil de messagerie qui effectue une différence de répertoire entre les validations arbitraires.

Depuis git v1.7.10, le git-diffallscript est inclus dans l' contribinstallation standard de git.

Pour les versions antérieures à la v1.7.10, vous pouvez installer à partir du git-diffallprojet sur GitHub .

Voici la description du projet:

Le script git-diffall fournit un mécanisme de diff basé sur un répertoire pour git. Le script s'appuie sur l'option de configuration diff.tool pour déterminer la visionneuse diff utilisée.

Ce script est compatible avec tous les formulaires utilisés pour spécifier une gamme de révisions à différencier:

1) git diffall: affiche les différences entre l'arborescence de travail et les modifications par étapes
2) git diffall --cached [<commit>]: affiche les différences entre les modifications par étapes et HEAD (ou un autre commit nommé)
3) git diffall <commit>: affiche les différences entre l'arborescence de travail et les commit nommés
4) git diffall <commit> <commit>: affiche les différences entre deux commits nommés
5) git diffall <commit>..<commit>: identique comme ci-dessus
6)git diffall <commit>...<commit> : montrer les changements sur la branche contenant et jusqu'à la seconde, en commençant par un ancêtre commun des deux<commit>

Remarque: toutes les formes prennent un limiteur de chemin optionnel [--] [<path>]

Ce script est basé sur un exemple fourni par Thomas Rast sur la liste Git .


Quelle est la différence entre git-diffall et github.com/wmanley/git-meld ? J'ai essayé les deux et ils semblent fournir des fonctionnalités identiques à première vue.
kynan

5
Pour ma part, j'apprécie grandement votre script. Franchement, je ne peux pas comprendre pourquoi Git ne se comporte pas correctement à cet égard (Mercurial le fait et l'a fait depuis des années), ni le manque d'intérêt de la communauté Git.
Douglas

6
Mise à jour (concernant git difftool --dir-diffet Beyond Compare): J'ai contacté Scooter Software (auteurs de Beyond Compare) et ils disent que ce bcompare.exen'est pas une solution prise en charge et peut causer des problèmes s'il y a plus d'un diff ouvert à la fois. Ils prévoient d'ajouter la prise en charge des différences de dossier bcomp.exedans une future version (en attendant, je continuerai à l'utiliser bcompare.execomme solution de contournement non prise en charge).
Peter Rust

4
@coin Je viens de tester avec Beyond Compare 4 et --dir-diff semble fonctionner avec le bcomp.exe pris en charge.
Peter Rust

5
Je commente juste pour dire que cela --dir-difffonctionne parfaitement avec Meld. De là, il vous permettra de sélectionner et d'afficher les différences pour les fichiers individuels.
mkasberg

61

Voici ce sur quoi je me suis installé ...

Copiez le code suivant dans un fichier appelé git-diffall(sans extension):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Placez le fichier dans le cmddossier de votre répertoire d'installation git (par exemple C:\Program Files (x86)\Git\cmd)

Et utilisez comme vous le feriez git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Remarques: La clé est le & param qui indique à la commande diff externe de s'exécuter dans une tâche en arrière-plan afin que les fichiers soient traités immédiatement. Dans le cas de BeyondCompare, cela ouvre un écran avec chaque fichier dans son propre onglet.


Merci d'avoir posté. Malheureusement, cela ne fonctionne pas avec l'option -s de WinMerge. Tous les fichiers temporaires, à l'exception du premier, sont supprimés avant que WinMerge ne les examine.
Carlos Rendon

Carlos: J'utilise WinMerge avec Git. Mon approche consistait à ajouter un 'sleep 1' après le lancement de WinMerge (qui dans mon cas semble déjà se lancer "en arrière-plan" - pas besoin de &). De cette façon, le fichier temporaire vit juste assez longtemps pour que WinMerge le récupère une fois (sauf dans des cas étranges). Cela signifie également qu'il faut 1 seconde par fichier pour les ouvrir tous. C'est un hack méchant (je ne le présenterais jamais comme une "réponse"!), Mais facile et assez efficace.
Woody Zenfell III du

2
Pour une utilisation sous Linux, avec Git 2.x, j'ai dû faire une légère modification: passer "$filename"à "../$filename". Ensuite, cela a parfaitement fonctionné avec Beyond Compare
Dave C

1
@DaveC dans le fil d'origine, il dit de "stocker le fichier dans le dossier cmd de votre installation git" et procède à un exemple sur Windows. Où avez-vous stocké le fichier "git-diffall" sous Linux?
m4l490n

2
Avons-nous besoin de redémarrer Windows après avoir ajouté un git-diffallfichier au C:\Program Files\Git\cmddossier? J'ai fait exactement comme indiqué mais en faisant $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld a une fonctionnalité intéressante que si vous lui donnez un répertoire sous contrôle de source (Git, Mercurial, Subversion, Bazaar et probablement d'autres), il répertoriera automatiquement tous les fichiers modifiés et vous pouvez double-cliquer pour afficher les différences individuelles.

IMO, il est beaucoup plus facile de taper meld .et de comprendre le VCS que de configurer votre VCS pour le lancer meld. De plus, vous pouvez utiliser la même commande, quel que soit le VCS que votre projet utilise, ce qui est génial si vous passez souvent de l'un à l'autre.

Le seul inconvénient est qu'il est plus lent pour meld de rechercher des modifications que de passer les modifications de git / hg / svn, bien que la lenteur de ce problème dépende de la façon dont vous l'utilisez, j'en suis sûr.


4
Pour moi, le principal inconvénient est que meld (pour une raison quelconque) ouvre le diff dans une nouvelle fenêtre au lieu d'un nouvel onglet et après avoir fermé le diff, le fichier dans le répertoire de travail s'ouvre dans un nouvel onglet avec un message contextuel ennuyeux avant.
kynan

bel outil mais horrible installation de Windows (début 2012).
Wernight

@kynan Cela semble être la solution parfaite pour une manière agnostique VCS de différer sinon pour ce truc ennuyeux de double fenêtre. C'est dommage. :(
PKKid

Une grande caractéristique de meld est ses filtres diff: ignorer les changements, par exemple dans les commentaires ou ajouter / supprimer des lignes vides, ce git diffqui ne propose pas.
kynan

1
J'ai utilisé cette approche pendant un an environ; cela fonctionne bien pour les petits projets mais une fois que vous avez un grand projet (c'est-à-dire beaucoup de fichiers), il est incroyablement lent car il "scanne" manuellement les différences git (je ne sais pas pourquoi il adopte cette approche alors que git peut clairement lui fournir une liste de fichiers directement ...)
namuol

3

J'ai trouvé cette méthode (GitDiff.bat et GitDiff.rb) qui copie les fichiers dans les anciens / nouveaux répertoires temporaires et fait ensuite une comparaison de dossiers sur eux.

Mais je préfère afficher les fichiers de travail directement (à partir du répertoire de travail), car BeyondCompare a la fonctionnalité pratique de pouvoir modifier le fichier à partir de la fenêtre de comparaison, ce qui est idéal pour les nettoyages rapides.

Edit: une méthode similaire ici en réponse à ma question sur la liste de diffusion git.



2

A remarqué ici que Araxis Merge a une option de commande '-nowait':

-nowait Empêche la comparaison d'attendre la fin d'une comparaison

Peut-être que cela renvoie un code de sortie immédiat et fonctionnerait, quelqu'un a-t-il vécu cela? Impossible de trouver une option similaire pour BeyondCompare ...


2

Diffuse a également une intégration VCS. Il interagit avec une pléthore d'autres VCS, y compris SVN, Mercurial, Bazaar, ... Pour Git, il affichera même trois volets si certains mais pas tous les changements sont mis en scène. En cas de conflit, il y aura même quatre volets.

Capture d'écran de diffuse avec des modifications échelonnées et non échelonnées

Invoquez-le avec

diffuse -m

dans votre copie de travail Git.

Si vous me demandez, le meilleur visuel diffère que j'ai vu depuis une décennie. (Et j'ai aussi essayé le meld.)


Pouvez-vous dire quelle partie du diffus vous avez aimé, en particulier au cours de la fusion?
musiphil

@musiphil: J'aime sa simplicité - il semble avoir exactement l'ensemble des fonctionnalités requises pour résoudre la tâche, pas plus, mais pas moins. (Comme le réalignement des différences et la largeur de la taille des onglets.) Je ne me souviens pas pourquoi je suis passé de meld, et je n'ai pas utilisé meld depuis lors, donc je ne peux pas vraiment les comparer maintenant.
krlmlr le

1
Diffuse a fonctionné avec git sans aucune configuration. Diffuse -m ouvre une fenêtre unique avec des différences git dans différents onglets; tandis que d'autres outils ont besoin de trop de configuration pour même commencer.
mosh

1

Si tout ce que vous voulez faire est d'ouvrir tous les fichiers actuellement modifiés, essayez quelque chose comme:

vi $ (git status | sed -n '/.*modified: * / s /// p')

Si vous effectuez des validations d '«ensembles complexes de modifications», vous souhaiterez peut-être reconsidérer votre flux de travail. L'une des fonctionnalités vraiment intéressantes de git est qu'il permet au développeur de réduire facilement les ensembles de modifications complexes en une série de correctifs simples. Plutôt que d'essayer de modifier tous les fichiers qui sont actuellement modifiés, vous voudrez peut-être examiner

git add --patch
qui vous permettra de mettre en scène sélectivement des mecs.


1

J'ai écrit un script PowerShell qui dupliquera deux arbres de travail et les comparera avec DiffMerge. Vous pouvez donc faire:

GitNdiff master~3 .

Par exemple, pour comparer la branche principale trois archivages avec l'arborescence de travail actuelle.

Son brillant et nouveau et probablement plein de bugs. Un inconvénient est que les fichiers de votre arborescence de travail qui n'ont pas encore été ajoutés sont copiés dans les deux arborescences de travail. Cela peut aussi être lent.

http://github.com/fschwiet/GitNdiff


1

Pour ceux qui souhaitent utiliser git-diffall sur Mac OS X avec Araxis, j'ai bifurqué le projet git-diffall sur github et ajouté un AppleScript qui encapsule la commande Araxis Merge. Remarque: il s'agit d'un clone légèrement modifié du araxisgitdifffichier fourni avec Araxis Merge pour Mac OS X.

https://github.com/sorens/git-diffall


1

Les travaux suivants avec meld et kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Ouvre tous les fichiers dans une fenêtre que vous pouvez parcourir facilement. Peut être utilisé avec des changesets à la place de l'origine / du nom de la branche

par exemple: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

Vous pouvez utiliser gitk et voir toutes les différences en même temps


3
Oui, je trouve gitk utile, mais quand il s'agit de différer la Colombie-Britannique, c'est ce que je veux voir :)
Seba Illingworth
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.