J'aime le format de sortie de git diff
. La couleur et la représentation +
/-
des modifications entre les lignes sont plus faciles à lire que GNU diff.
Je peux exécuter git diff
en utilisant le drapeau --no-index
en dehors d'un dépôt git et cela fonctionne bien. Cependant, il semble manquer l'option --exclude
pour exclure des fichiers ou des sous-répertoires d'une variable __ récursive diff
.
Y a-t-il un moyen d'obtenir le meilleur des deux mondes? (options de couleur et format +
/-
de git diff
et option --exclude
de GNU diff).
J'ai expérimenté avec colordiff
, mais je préfère quand même le format de sortie de git diff
Je ne sais pas comment faire de la couleur mais cela fera le +/-
plutôt que <
et >
.
diff -u file1 file2
Vous pouvez également utiliser git diff --no-index -- A B
(via manpage ).
Installez colordiff .
Mettez à jour votre ~/.colordiffrc (en copiant d'abord/etc/colordiffrc, si nécessaire):
# be more git-like:
plain=off
newtext=darkgreen
oldtext=darkred
diffstuff=darkcyan
Utilisez colordiff -u file1 file2
pour deux fichiers ou colordiff -ruN path1 path2
pour comparer récursivement les chemins.
Ce n'est pas exactement la même chose, mais c'est très proche.
C'est ce que je suggère et c'est assez proche
diff -u FILE1 FILE2 | colordiff | less -R
colordiff
: Vous devrez installer ceci brew install colordiff
sur mon Mac.port install colordiff
sur certains Mac.Sudo apt-get install colordiff
sur Debian ou Ubuntu-R
: ceci indique à Less d'afficher les couleurs au lieu des codes bruts.J'ai finalement utilisé -w
parce que je ne voulais pas voir les différences d'espaces.
diff -w -u FILE1 FILE2 | colordiff | less -R
Edit: Comme suggéré par @Ciprian Tomoiaga dans le commentaire, vous pouvez en faire une fonction et la placer également dans votre fichier ~/.bashrc
.
function gdiff () { diff -u $@ | colordiff | less -R; }
En utilisant uniquement bash
, diff
, tput
et less
, nous pouvons nous approcher de la sortie de git diff
. Cependant, il y aura des différences notables en raison de la vision à court terme des programmeurs diff
.
Placez la définition de la fonction Bash suivante dans un fichier généré automatiquement par votre compte utilisateur. Vous pourrez y accéder à partir de la ligne de commande:
function gdiff()
{
local REG=`tput op`
local GRP=`tput setaf 6`
local ADD=`tput setaf 2`
local REM=`tput setaf 1`
local NL=$'\n'
local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"
local UNCH_GRP_FMT=''
[[ "${1}" == '@full' ]] && {
UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
shift
}
diff \
--new-line-format="${ADD}+%L${REG}" \
--old-line-format="${REM}-%L${REG}" \
--unchanged-line-format=" %L${REG}" \
--new-group-format="${GRP_LABEL}${NL}%>" \
--old-group-format="${GRP_LABEL}${NL}%<" \
--changed-group-format="${GRP_LABEL}${NL}%<%>" \
--unchanged-group-format="${UNCH_GRP_FMT}" \
"${@}" | less -FXR
}
Cette fonction fonctionne comme suit:
diff
est appelé avec différentes options de formatage pour spécifier le mode d'affichage des modifications dans les fichiers.tput
est utilisé pour insérer des codes de couleur ANSI dans ces options de formatage. Notez que lorsque vous utilisez des terminaux non-ANSI, vous devrez peut-être remplacer tput setaf
par tput setf
.diff
est transférée dans less
. -R
permet de conserver les couleurs ANSI. -X
empêche less
d'effacer l'écran lors de la sortie. -F
empêche less
de fonctionner comme un pageur si la sortie tient dans un seul écran.@full
, la fonction affichera toutes les lignes non modifiées en plus des lignes ajoutées et supprimées.Notez les différences suivantes entre cette approche et git diff
:
git diff
rapporte trois lignes de contexte entourant chaque changement. Malheureusement, diff
semble se plaindre et se fermer si vous souhaitez spécifier le nombre de lignes de contexte tout en spécifiant simultanément les options de formatage. (Au moins c'est le cas dans Mac OS X Yosemite). Merci diff
programmeurs. Par conséquent, vous pouvez soit ne demander aucune ligne de contexte entourant chaque modification (comportement par défaut), soit demander que toutes les lignes non modifiées du fichier soient également signalées en spécifiant @full
en tant que premier paramètre.git diff
, les numéros de ligne indiqués par cette fonction seront également différents de ceux indiqués par git diff
.git diff
traite mieux cela, via ses lignes de contexte. Vous pouvez essayer de passer différentes options à diff
afin de mieux gérer les espaces, si vous préférez.Vous recherchez colordiff
:
Sudo apt-get install colordiff
GNU diff
a une option --color
depuis la version 3.4 fin 2016 selon cette réponse sur Unix SE. Cela devrait suffire, à côté de -u
, à reproduire le résultat de git diff
:
diff -u --color=always file1 file2 | less -r
--color
doit être always
lorsqu'il est utilisé dans un tuyau, auto
désactive la couleur dans les tuyaux.
Je n'ai essayé cela qu'avec Git Bash sous Windows, où less -R
ne ferait que colorer la première ligne d'un morceau. less -r
l'a corrigé pour moi dans ce cas.
Utilisez colordiff :
Installation:
Sudo apt-get install colordiff
Utilisation:
colordiff -u file_one file_two
Donne exactement la même différence que celle indiquée par git diff
.
L'autre option consiste à le faire depuis l'extérieur du référentiel afin que git sache qu'il existe une différence entre les fichiers. par exemple. une fonction Shell quelque chose comme:
gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff $dir/$1 $dir/$2
)
}