web-dev-qa-db-fra.com

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

Le comportement par défaut de git diff consiste à 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 des onglets de la même fenêtre BC.

Cela faciliterait l'examen d'un ensemble complexe de modifications; faites défiler les fichiers diff et transférez-les et ignorez les fichiers sans importance.

226
Seba Illingworth

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

Copiez le code suivant dans un fichier nommé 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 dossier cmd 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: Le paramètre & indique à la commande externe diff 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.

61
Seba Illingworth

À partir de git v1.7.11, vous pouvez utiliser git difftool --dir-diff pour effectuer un répertoire diff.

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

C'est une fonction pratique de Bash:

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

La réponse qui suit s’applique aux git installations antérieures à la v1.7.11.


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

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

À partir de git v1.7.10, le git-diffall Le script est inclus dans le contrib de l’installation standard de git.

Pour les versions antérieures à v1.7.10, vous pouvez installer à partir de git-diffall projet 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 quel visualiseur de diff est utilisé.

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

1) git diffall: affiche les différences entre l’arbre de travail et les modifications planifiées
2) git diffall --cached [<commit>]: affiche les différences entre les modifications planifiées et HEAD (ou tout autre commit nommé)
3) git diffall <commit>: affiche les différences entre l'arbre de travail et le commit nommé
4) git diffall <commit> <commit>: affiche le diff entre deux commits nommés
5) git diffall <commit>..<commit>: comme ci-dessus
6) git diffall <commit>...<commit>: affiche les modifications sur la branche contenant et jusqu’à la seconde, en partant d’un ancêtre commun aux deux <commit>

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

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

199
Tim Henigan

meld possède une fonctionnalité intéressante: si vous lui attribuez 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 pourrez double-cliquez pour afficher les différences individuelles.

OMI, il est beaucoup plus facile de taper meld . et demandez au VCS de configurer votre VCS pour qu'il lance meld. De plus, vous pouvez utiliser la même commande quel que soit le type de VCS utilisé par votre projet, ce qui est très bien si vous basculez beaucoup entre eux.

Le seul inconvénient est qu'il est plus lent pour que meld analyse les modifications plutôt que de les transmettre à git/hg/svn, bien que sa lenteur à être un problème dépendra de la façon dont vous l'utiliserez, j'en suis sûr.

19
Tom

git meld => https://github.com/wmanley/git-meld est un script génial qui ouvre un fichier de comparaison intéressant de tous les fichiers dans une seule fenêtre.

3
Khaja Minhajuddin

J'ai trouvé cette méthode (GitDiff.bat et GitDiff.rb) qui copie les fichiers dans les anciens/nouveaux répertoires temporaires, puis effectue la comparaison des dossiers.

Mais je préférerais voir les fichiers de travail directement (à partir du répertoire de travail), car BeyondCompare a la particularité pratique de pouvoir éditer le fichier à partir de la fenêtre de diff, ce qui est idéal pour les nettoyages rapides.

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

3
Seba Illingworth

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 panneaux si certains changements ne sont pas mis en scène. En cas de conflit, il y aura même quatre volets.

Screenshot of diffuse with staged and unstaged edits

Invoquer avec

diffuse -m

dans votre copie de travail Git.

Si vous me demandez, la meilleure différence visuelle que j'ai vue depuis une décennie. (Et j'ai essayé de fondre aussi.)

2
krlmlr

Si vous souhaitez uniquement ouvrir tous les fichiers en cours de modification, essayez l'une des solutions suivantes:

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

Si vous effectuez des validations sur des "ensembles complexes de modifications", vous voudrez peut-être reconsidérer votre flux de travail. 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 à une série de correctifs simples. Plutôt que d’essayer d’éditer tous les fichiers en cours de modification, vous voudrez peut-être examiner

git add --patch
1
William Pursell

J'ai écrit un script PowerShell qui dupliquera deux arbres de travail et se comparera à DiffMerge. Alors tu peux faire:

GitNdiff master~3 .

Pour comparer la branche principale il y a trois checkins avec l'arbre de travail actuel, par exemple.

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

http://github.com/fschwiet/GitNdiff

1
Frank Schwieterman

Ce qui suit fonctionne 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/nom de la branche

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

1
feltspar

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

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

1
sorens

noté ici qu'Araxis Merge a une option de commande '-nowait':

-nowait Empêche la comparaison d'attendre qu'une comparaison soit fermée

Peut-être que cela retourne un code de sortie immédiat et que cela fonctionnerait, quelqu'un l'a expérimenté? Impossible de trouver une option similaire pour BeyondCompare ...

1
Seba Illingworth