git macos command-line filemerge

¿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.