Comment puis-je utiliser FileMerge comme un outil diff avec git sur OS X?

je suis nouveau à git sur OS X, et je l'utilise via la ligne de commande. Je viens du monde de la tortue SVN et au-delà de comparer sur les fenêtres.

je veux pouvoir envoyer des diffs à FileMerge.

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

git diff | mate

mais je ne suis pas sûr de savoir comment configurer cela pour que je puisse utiliser FileMerge à la place?

36
demandé sur CajunLuke 2010-03-18 03:15:15

3 réponses

bien que ce ne soit pas exactement la même chose que piping stdin dans un script, vous pouvez faire ceci:

git difftool -t opendiff -y

qui lancera FileMerge une fois pour chaque fichier. Faire tout l'arbre du projet à la fois prend un peu de scripting .

Voir aussi cette question .

51
répondu undees 2017-05-23 12:00:14

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

#!/bin/bash

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

/usr/bin/opendiff "" "" -merge ""

modifiez maintenant votre fichier .gitconfig pour inclure les lignes

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

...remplacer <path-to> par git-diff-cmd.sh . Maintenant git diff va utiliser FileMerge, et afficher correctement les caractères Unicode UTF-8.

13
répondu Syzygies 2014-02-26 20:14:53

voici un script (à l'origine par Toby White) que j'ai piraté pour comparer la structure entière 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
# - allow diff of subdirectory within the repo
#
# 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.

OLD=
NEW=
FILEPATH=
HAS_ARGS=no
IGNORE_TO_PATH=no

# loosely based on https://stackoverflow.com/a/14787208/10840
while [ "$#" -ge 1 ]; do
    HAS_ARGS=yes
    case "" in
        -h)
            echo "usage: "151900920" [--cached | <ref> [<ref>]] [-- <path>]"
            exit 0
            ;;
        --cached)
            # diff staged changes
            NEW=$(git write-tree)
            OLD=HEAD
            IGNORE_TO_PATH=yes
            shift
            ;;
        --)
            shift
            FILEPATH="$@"
            break
            ;;
        *)
            if [[ "$IGNORE_TO_PATH" == "no" ]]; then
                if [ -z "$OLD" ]; then
                    OLD=""
                else
                    NEW=""
                    IGNORE_TO_PATH=yes
                fi
            fi
            shift
            ;;
    esac
done
if [ -z "$OLD" ]; then
    OLD=HEAD
fi
if [[ "$HAS_ARGS" == "no" ]]; then
    # diff unstaged changes
    # http://stackoverflow.com/a/12010656/10840
    NEW=$(git stash create)
    echo "diff unstaged changes"
fi

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 $FILEPATH | (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 $FILEPATH | (cd $TMP_NEW; tar xf -)
    opendiff $TMP_OLD/$FILEPATH $TMP_NEW/$FILEPATH -merge $SAVE_TO &> /dev/null &
else
    TMP_NEW=$TMP_NEW/$NEW; mkdir -p $TMP_NEW
    git archive --format=tar $NEW $FILEPATH | (cd $TMP_NEW; tar xf -)
    opendiff $TMP_OLD/$FILEPATH $TMP_NEW/$FILEPATH &> /dev/null &
fi

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

mise à Jour: diff unstaged changements lorsqu'il est appelé sans arguments, a ajouté: -h (aide).

mise à jour: sous-répertoire diff avec -- <path> . Aussi meilleure analyse des arguments.

5
répondu millerdev 2018-04-19 22:24:45