$ git diff
diff --git a/lorem.txt b/lorem.txt
index d5d20a4..58609a7 100644
--- a/lorem.txt
+++ b/lorem.txt
@@ -2,10 +2,14 @@ Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor
incididunt ut labore et dolore
-magna aliqua. Ut enim ad minim
+minim
+minim
veniam, quis nostrud
exercitation ullamco laboris
+maxim
+maxim
nisi ut aliquip ex ea commodo
+minim
consequat. Duis aute irure
dolor in reprehenderit in
voluptate velit esse cillum
字符串 还有:
$ git diff --cached # nothing staged in the index
型 我们的目标是只提交包含min匹配项的行:
$ txr addmatch.txr min lorem.txt
patching file .merge_file_BilTfQ
型 现在的状态是什么?
$ git diff
diff --git a/lorem.txt b/lorem.txt
index 7e1b4cb..58609a7 100644
--- a/lorem.txt
+++ b/lorem.txt
@@ -6,6 +6,8 @@ minim
minim
veniam, quis nostrud
exercitation ullamco laboris
+maxim
+maxim
nisi ut aliquip ex ea commodo
minim
consequat. Duis aute irure
型 还有:
$ git diff --cached
diff --git a/lorem.txt b/lorem.txt
index d5d20a4..7e1b4cb 100644
--- a/lorem.txt
+++ b/lorem.txt
@@ -2,10 +2,12 @@ Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor
incididunt ut labore et dolore
-magna aliqua. Ut enim ad minim
+minim
+minim
veniam, quis nostrud
exercitation ullamco laboris
nisi ut aliquip ex ea commodo
+minim
consequat. Duis aute irure
dolor in reprehenderit in
voluptate velit esse cillum
6条答案
按热度按时间cx6n0qe31#
这里有一个方法:
1.使用
git diff > patch
对当前的diff进行修补。1.使用
gawk
仅生成+/-
行的第二个面片,与图案匹配:从不匹配模式的删除行中删除-
,删除不匹配模式的+
行,修改块标题行号,输出每个修改后的块,但不输出任何修改后的块,这些块中不再有任何更改。1.使用
git stash save
、apply patch
、add -u
和stash pop
应用并暂存修改后的修补程序,而不暂存其余更改。这对几个测试用例都有效,它可以一次处理整个diff(所有文件),而且速度很快。
字符串
参考文献:
git diff
apply
统一差分格式
gawk
match
groups to array的git add -u
的atmip9wb2#
我在TXR中开发了这个实验性的、测试很差的程序:
示例运行:首先,我们在回购中的位置:
字符串
还有:
型
我们的目标是只提交包含
min
匹配项的行:型
现在的状态是什么?
型
还有:
型
匹配的内容在索引中,而不匹配的
+maxim
行仍然是未登台的。addmatch.txr
中的代码:型
基本策略是:
git diff
输出上进行一些模式匹配,以将块向下过滤到匹配行。我们必须重新计算大块标题中的“after”行计数,并保留上下文行。git checkout-index --temp
从索引中获取该文件的原始副本。这个命令输出它生成的临时名称,我们捕获它。patch -p1
,目标是这个临时文件,该文件保存了索引中的原始副本。好了,我们现在已经有了我们想要的变更,套用到原始档案。git hash-object -w
从修补文件创建一个Git对象。捕获此命令输出的哈希。git update-index --cacheinfo ...
将这个新对象输入到原始文件名下的索引中,从而有效地为文件准备了一个更改。如果这搞砸了,我们可以做
git reset
来擦除索引,修复我们损坏的脚本,然后再试一次。仅仅通过
+
和-
行进行盲目匹配存在明显的问题。当模式匹配配置文件中的变量名而不是内容时,它应该可以工作。例如:替换:
型
这里,如果我们在
CONFIG_VAR
上匹配,则两行都包括在内。如果我们在右手边的foo
上进行匹配,我们会破坏东西:我们最终得到的补丁只是减去了CONFIG_VAR=foo
行!显然,考虑到配置文件的语法和语义,这可以做得更聪明。
真实的解决这个问题的方法是编写一个健壮的配置文件解析器和重新生成器(保留注解、空格等)。然后解析新的和原始的原始文件以配置对象,将匹配的更改从一个对象迁移到另一个对象,并生成一个更新的文件以转到索引。不要乱打补丁。
jchrr9hc3#
我认为这是不可能的因为
git add -p
总是显示大量的变化;但是该块可能包含一些您想要添加的行(并且与您的模式匹配)和一个包含您不想添加的更改的行。有时候,当我做了两个更改并希望分别提交它们时,我会遇到类似的问题:
有一个我使用的解决方法:
git stash
或仅复制文件)git stash pop
或复制回文件)v7pvogib4#
这当然很疯狂但你知道,我们有一些疯狂的工作流程在我的工作,我偶尔会问,通常有一些很好的理由疯狂。
好的,这个模式是逐行模式还是“如果块包含它”模式?如果是一行一行的,也许你可以这样做。这不会完全奏效,但这是一个开始
字符串
如果您必须应用任何具有您正在寻找的模式的块,那么您将需要一个更长、更有状态的脚本来解析您的diff。事实上,这可能是必要的,无论如何。在diff中搜索表示diff部分开始的'@@'字符。把那一部分缓冲起来,直到你走到最后。如果遇到了有问题的模式,输出该部分,如果没有,则将其丢弃。然后将新差异作为补丁应用。
型
fwzugrvs5#
如果你使用VSCode,你可以选择所有匹配文件中模式的行,并暂存它们:
1.在“源代码管理”窗格中打开一个比较。
1.选择示例行,然后按住ctrlD以选择所有其他匹配行。点击ctrlD一次后,可以使用右上角的浮动面板启用基于regex的搜索。
uqdfh47h6#
您可以从
git ls-files
开始获取给定路径的感兴趣文件列表。然后,您可以将该列表通过管道传输到grep
,并基于正则表达式匹配进行限制。最后,这个精简的文件列表可以通过xargs git add
管道传输到git add
:字符串
这种方法将允许您应用智能正则表达式,希望它可以减少交互式
git add
会话的文件数量。根据定义,执行git add -p
需要人工交互,因此如果在应用模式之后仍然有太多文件,那么应该找到另一种方法。如果你想添加整个文件,而不是行,尝试this answer。