Подтвердить что ты не робот

Как мне подключиться в FileMerge в качестве инструмента для сравнения с git в OS X?

Я новичок в git в OS X, и я использую его через командную строку. Я родом из мира Tortoise SVN и Beyond Compare в Windows.

Я хочу иметь возможность отправлять diff в FileMerge.

Я смог сделать это с помощью TextMate, просто используя:

git diff | mate

Но я не уверен, как получить эту настройку, чтобы вместо этого использовать FileMerge?

4b9b3361

Ответ 1

Хотя это не совсем то же самое, что и piping stdin в script, вы можете сделать это:

git difftool -t opendiff -y

Это запустит FileMerge один раз для каждого файла. Выполнение всего дерева проектов сразу занимает немного скриптов.

См. также этот вопрос.

Ответ 2

Создать исполняемый файл script 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"

Теперь отредактируйте файл .gitconfig, чтобы включить строки

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

... заменив <path-to> на путь до git-diff-cmd.sh. Теперь git diff будет использовать FileMerge и правильно отображать символы Unicode UTF-8.

Ответ 3

Здесь script (первоначально Тоби Уайт), который я взломал, чтобы сравнить всю структуру каталогов в FileMerge, а не открывать каждый файл отдельно.

#!/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

Поместите это где-нибудь на свой путь. Я предпочитаю ~/bin/git-opendiff, что означает, что git opendiff ... работает так, как ожидалось.

Обновление: diff нестационарные изменения при вызове без аргументов, добавлена ​​опция -h (help).