私はOSXでgitを初めて使用し、コマンドラインから使用しています。私はWindowsのTortoiseSVNとBeyondCompareの世界から来ました。
FileMergeに差分を送信できるようにしたい。
私はTextMateでこれを簡単に使用することができました:
git diff | mate
しかし、代わりにFileMergeを使用できるように、その設定方法がわかりません。
Stdinをスクリプトにパイプすることとまったく同じではありませんが、これを行うことができます。
git difftool -t opendiff -y
これにより、ファイルごとに1回FileMergeが起動します。プロジェクトツリー全体を一度に実行する 少しスクリプトが必要です 。
この質問 も参照してください。
実行可能スクリプトを作成する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を使用し、UTF-8Unicode文字を正しく表示します。
これは、各ファイルを個別に開くのではなく、FileMergeのディレクトリ構造全体を比較するためにハッキングしたスクリプト(元々はToby Whiteによるもの)です。
#!/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 "$1" in
-h)
echo "usage: $0 [--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="$1"
else
NEW="$1"
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
これをあなたの道のどこかに置いてください。私は~/bin/git-opendiff
を好みます。これは、git opendiff ...
が期待どおりに機能することを意味します。
更新:引数なしで呼び出された場合のステージングされていない変更の差分、-h
(ヘルプ)オプションの追加。
更新:-- <path>
のdiffサブディレクトリ。また、より良い引数解析。
OS Xをアップデートしてから、何が起こっているのかわかりませんが、opendiffが以前のように機能しなくなりました。だから私はこのスクリプトを ここ からコピーしました、そしてそれは働きました。
#!/bin/sh
dir=$PWD
until [ -e "$dir/.git" ]; do
if [ "$dir" == "/" ]; then
echo "Not a git repository" >&2
exit 1;
fi
dir=`dirname "$dir"`
done
open -a FileMerge -n -W --args -left "$dir/$1" -right "$2" -merge "$5"