我正在审核一个能够移动很多的东西的补丁,添加了一些东西,并删除了一些东西。我想知道是否有人编写了一个实用工具,用于在通用差异中挑选出独特的添加/删除?
也就是说,添加和删除相同的行应该自行取消。
显然这并不是一直有用,但有时它正是我想要的:)
答案 0 :(得分:15)
这是我最终使用的。
使用示例:
git diff -w | /path/to/ignore_moves.py | less -R
#!/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()
答案 1 :(得分:9)
这对我来说更好地获取修改后的文件的差异(省略仅被移动的文件)。
git diff -M -C -D
来自git diff文档:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index (i.e. amount of addition/deletions compared 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, i.e. 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.
答案 2 :(得分:2)
答案 3 :(得分:1)
无需其他脚本的有效解决方案:
git diff --diff-filter=r origin/master..HEAD
根据man git-diff
,您可以过滤所有内容(A-添加,C-复制,D-删除,M-修改)。注意:小写字母表示“排除”。