¿Cómo canalizo en FileMerge como una herramienta diff con git en OS X?

Soy nuevo en git en OS X, y lo estoy usando a través de la línea de command. 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 configuration 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 file. Hacer todo el tree 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 file .gitconfig para include 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.

Aquí hay un script (originalmente de Toby White) que pirateé para comparar toda la estructura de directorys en FileMerge en lugar de abrir cada file 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 ignonetworking 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 

Pon esto en algún lugar en tu path. Prefiero ~/bin/git-opendiff , lo que significa que git opendiff ... funciona como se esperaba.

Actualización: dif cambios sin escenario cuando se llama sin arguments, se agregó la opción -h (ayuda).

Intereting Posts