gpt4 book ai didi

git - 如何编写外部 git diff 来比较添加的行和删除的行(并 stash 匹配项)?

转载 作者:太空狗 更新时间:2023-10-29 13:03:11 27 4
gpt4 key购买 nike

在我的文本文件中,我经常移动大的部分。换句话说,我将一段长度从 3 到 50 行不等的部分剪切下来,然后原封不动地粘贴到文件中的其他位置。

在“未提交的更改”下,Git(我使用 Github OSX)将这些行显示为在文件的一部分中被“删除”并在另一部分中被“添加”。

鉴于我的工作流程,如果 Git 的差异显示没有为我突出显示我只是从一个地方移动到另一个地方的部分,那将会更有帮助。相反,我希望 Git 只为我突出显示全新的行,以及我已从文件中完全删除的行。 (以及我更改了部分内容的行。)

如果在文件的其他地方发现相同的“添加”部分,是否有一种方法可以指示 Git 的差异显示忽略 3 行以上的“已删除”部分?

目前我使用wdiff = diff-highlight

更新:看起来指定外部 git diff 很简单:

gitconfig
[diff]
external = ~/prose-diffs.py

有没有人有一个外部 git diff 比较“添加”部分和“删除”部分(忽略开头和结尾的换行符),并自动 stash 添加行与删除行匹配的任何部分?

最佳答案

步骤概述

  1. 一个 diff 程序 - 一个理解行重新排序的程序
  2. 使用新的 diff 程序 - 设置你的 git 配置

差异程序:

事实证明,git 将使用以下参数调用您的 diff 程序:

> my_diff_tool <filename> <old_location> <old_hash> <old_mode> <new_location> <new_hash> <new_mode>

所以这是最简单的 diff 工具,它可以做一些接近您想要的事情。它读取文件,然后使用集合比较打印出新行和旧行。

#!/usr/bin/python
import sys

old = open(sys.argv[2]).read().splitlines()
new = open(sys.argv[5]).read().splitlines()

print "-"* 80
print "Filename: %s" % sys.argv[1]

# Simple set method
for line in set(old) - set(new):
print '- %s' % line
for line in set(new) - set(old):
print '+ %s' % line
if set(new) == set(old):
print "Text reordering only"

这是一个输出结果与 diff 输出结果的示例:

我的差异化工具

Filename: test.txt
- luctus pellentesque.
+ luctus pellentesque. Puric huma te.

差异

diff --git a/test.txt b/test.txt
index 2ec8f4b..797e2ad 100644
--- a/test.txt
+++ b/test.txt
@@ -4,15 +4,15 @@ dolor quis feugiat. Nullam vel interdum leo, a placerat elit. Mauris quis
faucibus dui.

Nullam eu sapien quis ex convallis tincidunt. Mauris tristique mauris ac
-luctus pellentesque.
+luctus pellentesque. Puric huma te.

Duis at imperdiet lacus. Sed malesuada elit vitae arcu semper, at fringilla
purus rhoncus. Sed vestibulum pellentesque libero in interdum. Fusce elementum
ornare vulputate.

+Nam sed enim at nisi tincidunt accumsan eu nec nisl. Duis suscipit hendrerit
+fermentum. Sed mattis purus congue velit aliquet, non placerat lectus varius.
+
Donec placerat, purus ac aliquet ullamcorper, elit leo accumsan ante, sed
lacinia leo sem sed metus. Morbi lacinia porttitor ante, eget consequat
libero accumsan in. Nunc sit amet lectus magna.
-
-Nam sed enim at nisi tincidunt accumsan eu nec nisl. Duis suscipit hendrerit
-fermentum. Sed mattis purus congue velit aliquet, non placerat lectus varius.

显然,还有很多需要改进的地方。例如,集合将忽略重复的行。集合也会重新排序,因此如果有很多新行就更难理解。

这些改进留给读者作为练习。

使用新的差异程序

设置 git 配置以使用新工具很容易。您还可以修改您的 .gitconfig,如上所示。

> git config diff.external /location/to/your/diff/tool/my_diff_tool

你需要确保你的 diff 工具是可执行的,否则你会得到一个错误(fatal: cannot exec '/location/to/your/diff/tool/my_diff_tool': Permission denied) 所以:

> chmod +x /location/to/your/diff/tool/my_diff_tool

关于git - 如何编写外部 git diff 来比较添加的行和删除的行(并 stash 匹配项)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33592720/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com