Resaltando líneas añadidas / eliminadas, ignorando movimientos, en un file de parche

Estoy revisando un parche que movió muchas cosas, agregué algunas cosas y eliminé algunas cosas. Me pregunto si alguien ha escrito una utilidad para seleccionar los únicos añadidos / elimina en un diff universal.

Es decir, un complemento y una eliminación de la misma línea deberían cancelarse.

Obviamente esto no es útil todo el time, pero a veces es exactamente lo que quiero 🙂

Esto es lo que terminé usando.

Ejemplo de uso:

git diff -w | /path/to/ignore_moves.py | less -R

ignore_moves.py

 #!/usr/bin/python import sys from itertools import * RED = 31 GREEN = 32 RESET_SEQ = "\033[0m" COLOR_SEQ = "\033[0;%dm" stack = [] def inverse(line): return ('-' if line[0] == '+' else '+') + line[1:].strip() def reverse_enumerate(l): for i, x in enumerate(reversed(l)): yield len(l)-1-i, x def dumpchanges(): for line in stack: SEQ = COLOR_SEQ % (GREEN if line.startswith('+') else RED) print SEQ + line.strip() + RESET_SEQ stack[:] = [] for line in sys.stdin.readlines(): if not line[1:].strip(): continue # ignore empty lines if line.startswith(('---', '+++')): dumpchanges() print line.strip() elif line.startswith(('+', '-')): inverted = inverse(line) line = line[0] + line[1:].strip() for i, match in reverse_enumerate(stack): if inverted == match: stack.pop(i) break else: stack.append(line) # finished reading, still have state to be dumped dumpchanges() 

Esto funcionó mejor para mí para get la diferencia de los files modificados (omitiendo files que solo se movieron).

git diff -M -C -D

De la documentation de git diff:

 -M[<n>], --find-renames[=<n>] Detect renames. If n is specified, it is a threshold on the similarity index (ie amount of addition/deletions companetworking to the file's size). For example, -M90% means git should consider a delete/add pair to be a rename if more than 90% of the file hasn't changed. -C[<n>], --find-copies[=<n>] Detect copies as well as renames. See also --find-copies-harder. If n is specified, it has the same meaning as for -M<n>. -D, --irreversible-delete Omit the preimage for deletes, ie print only the header but not the diff between the preimage and /dev/null. The resulting patch is not meant to be applied with patch nor git apply; this is solely for people who want to just concentrate on reviewing the text after the change. In addition, the output obviously lack enough information to apply such a patch in reverse, even manually, hence the name of the option. 

Aquí está, con Bash

 git diff | diff-ignore-moved-lines 

Ignorar líneas movidas diff