2010-03-18 16 views
36

Je suis nouveau à git sur OS X, et je l'utilise via la ligne de commande. Je viens du monde de Tortoise SVN et Beyond Compare sur Windows.Comment est-ce que je canalise dans FileMerge comme outil de diff avec git sur OS X?

Je veux être en mesure d'envoyer des différences à FileMerge.

j'ai pu le faire avec TextMate simplement en utilisant:

git diff | mate 

Mais je ne suis pas sûr de savoir comment mettre en place que je peux donc utiliser FileMerge à la place?

Répondre

51

Bien qu'il soit pas exactement la même chose que stdin de tuyauterie dans un script, vous pouvez le faire:

git difftool -t opendiff -y 

qui lancera FileMerge une fois pour chaque fichier. Faire tout l'arbre du projet à la fois takes a little scripting. Voir aussi this question.

+0

merci !!!!!!!!!!!!!! donc "difftool" est comme une commande "diff" normale mais donnant le choix pour un outil de comparaison externe? et "opendiff" appelle spécifiquement FileMerge? et je peux toujours passer un chemin à un fichier spécifique pour diff un seul? désolé, à la maison maintenant et incapable de tester sur ma machine de travail;) – Doug

+0

effectivement, cela ne fait rien pour moi, je vois. ma ligne de commande renvoie juste une invite. J'ai essayé d'avoir filemerge tiré, rien. – doug

+0

Salut, Doug. Il peut être difficile de trouver le binaire "opendiff" sur votre chemin. Que se passe-t-il lorsque vous créez un couple de fichiers texte, puis tapez "opendiff file1.txt file2.txt" dans Terminal? – undees

13

Créer un script exécutable git-diff-cmd.sh

#!/bin/bash 

xattr -w com.apple.TextEncoding "UTF-8;134217984" "$2" 
xattr -w com.apple.TextEncoding "UTF-8;134217984" "$5" 

/usr/bin/opendiff "$2" "$5" -merge "$1" 

maintenant modifier votre fichier .gitconfig pour inclure les lignes

[diff] 
    external = <path-to>/git-diff-cmd.sh 

... remplaçant <path-to> par le chemin de git-diff-cmd.sh. Maintenant, git diff utilisera FileMerge et affichera correctement les caractères Unicode UTF-8.

+0

Cela fonctionne très bien, mais quelqu'un peut-il expliquer comment j'utiliserais ce script avec 'difftool' à la place?Il semble qu'en utilisant 'cmd = /git-diff-cmd.sh' le script n'obtient pas les mêmes variables que lorsqu'on utilise' external'. –

+1

Assurez-vous de 'chmod 755 git-diff-cmd.sh' de peur d'obtenir' Permission denied'. –

+0

@Boblet le script que Syzgies a posté passe les paramètres de position 2, 5, & 1 à opendiff en ignorant le reste. 'difftool' ** probablement ** passe juste dans 2 params – nhed

5

Voici un script (à l'origine par Toby White) que j'ai piraté pour comparer toute la structure du répertoire dans FileMerge plutôt que d'ouvrir chaque fichier individuellement.

#!/bin/sh 
# 
# This script was written by Toby White under an unknown license, and published 
# on the Git mailing list: 
# 
# http://kerneltrap.org/mailarchive/git/2007/11/21/435536 
# 
# Superficial changes were made by Nathan de Vries to allow the script to be 
# run under Leopard. 
# 
# Adapted by Daniel Miller : http://stackoverflow.com/a/12957945/10840 
# - allow changes to be saved back to the working copy when diffing against HEAD 
# - work when FileMerge is already open 
# - always compare archived copies so ignored files are excluded from the diff 
# - allow diff of unstaged changes (no arguments); creates a dangling commit 
# 
# Known issues: 
# - Always uses the same two directories (/tmp/git-opendiff-old and 
# /tmp/git-opendiff-new); THEY WILL BE DELETED IF THEY ALREADY EXIST. 
# Ugly, I know, but it makes the script work even if FileMerge is open. 
# - Does not show unstaged changes. 

if test "$1" = -h; then 
    echo "usage: $0 [--cached | <ref>] [<ref>]" 
    exit 
elif test $# = 0; then 
    # diff unstaged changes 
    # http://stackoverflow.com/a/12010656/10840 
    NEW=$(git stash create) 
    OLD=HEAD 
elif test "$1" = --cached; then 
    # diff staged changes 
    OLD=HEAD 
    NEW=`git write-tree` 
    shift 
fi 
if test $# -gt 0; then 
    OLD="$1"; shift 
fi 
test $# -gt 0 && test -z "$CACHED" && NEW="$1" 

TMP_OLD=/tmp/git-opendiff-old 
TMP_NEW=/tmp/git-opendiff-new 
test -d $TMP_OLD && rm -rf $TMP_OLD; mkdir $TMP_OLD 
test -d $TMP_NEW && rm -rf $TMP_NEW; mkdir $TMP_NEW 

TMP_OLD=$TMP_OLD/$OLD; mkdir -p $TMP_OLD 
git archive --format=tar $OLD | (cd $TMP_OLD; tar xf -) 

if test -z "$NEW"; then 
    SAVE_TO=$(git rev-parse --show-cdup) 
    test -z "$cdup" && SAVE_TO=. 
    git archive --format=tar HEAD | (cd $TMP_NEW; tar xf -) 
    opendiff $TMP_OLD $TMP_NEW -merge $SAVE_TO 
else 
    TMP_NEW=$TMP_NEW/$NEW; mkdir -p $TMP_NEW 
    git archive --format=tar $NEW | (cd $TMP_NEW; tar xf -) 
    opendiff $TMP_OLD $TMP_NEW 
fi 

Mettez ceci quelque part sur votre chemin. Je préfère ~/bin/git-opendiff, ce qui signifie git opendiff ... fonctionne comme prévu.

Mise à jour: changements non synchronisés lorsqu'ils sont appelés sans arguments, option -h (aide) ajoutée.

+0

J'ai ajouté ce script mais j'obtiens'> git opendiff README.md' 'git: 'opendiff' n'est pas une commande git. Voir 'git --help'. ' –

+0

@HarryMoreno semble que le script n'est probablement pas dans votre chemin. En outre, votre utilisation semble problématique. Ce script sert à comparer des arbres entiers, pas des fichiers individuels. – millerdev