¿Cómo canalizo en FileMerge como una herramienta diff con git en OS X?
macos command-line (3)
Aquí hay un script (originalmente de Toby White) que pirateé para comparar toda la estructura de directorios en FileMerge en lugar de abrir cada archivo individualmente.
#!/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
Pon esto en algún lugar en tu camino. Prefiero ~/bin/git-opendiff
, lo que significa que git opendiff ...
funciona como se esperaba.
Actualización: dif cambios sin escenario cuando se llama sin argumentos, se agregó la opción -h
(ayuda).
Actualización: subdirectorio diff con -- <path>
. También mejor análisis de argumentos.
Soy nuevo en git en OS X, y lo estoy usando a través de la línea de comando. Vengo del mundo de Tortoise SVN y Beyond Compare en Windows.
Quiero poder enviar diffs a FileMerge.
Pude hacer esto con TextMate simplemente usando:
git diff | mate
Pero no estoy seguro de cómo configurar esa configuración para que pueda usar FileMerge en su lugar?
Aunque no es exactamente lo mismo que instalar Stdin en un script, puedes hacer esto:
git difftool -t opendiff -y
Eso lanzará FileMerge una vez para cada archivo. Hacer todo el árbol del proyecto de una vez requiere un pequeño guión .
Ver también esta pregunta .
Crear un script ejecutable 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"
Ahora edite su archivo .gitconfig
para incluir las líneas
[diff]
external = <path-to>/git-diff-cmd.sh
... reemplazando <path-to>
por la ruta a git-diff-cmd.sh
. Ahora git diff
usará FileMerge y mostrará correctamente los caracteres Unicode UTF-8.