在Git中以非交互方式暂存部分更改

8
git add -p 命令允许交互式地暂存文件的部分(详情请参见 https://git-scm.com/book/zh/v2/Git-工具-交互式暂存)。
有没有一种非交互式地暂存部分内容的方式?例如,我有这些部分内容:
$ git diff
diff --git a/test.txt b/test.txt
index 77e67ac..34eabb1 100644
--- a/test.txt
+++ b/test.txt
@@ -1,4 +1,4 @@
-this is the first change
+this is the first change, don't stage it!



@@ -6,5 +6,5 @@ this is the first change



-this is the first change
+this is the second change, stage it!

希望有一个单一的命令可以像这样运行:git add -p 2,以便可以在不经过交互式菜单的情况下暂存第二个补丁。
注意:这里提到了一个解决方案(How to stage chunks non-interactively in git?),但它涉及多个命令和编辑补丁文件的额外步骤。
何时使用这个功能?例如我正在编辑一个长而重复的JSON文件,在运行git diff后,我知道我想要将每个其他补丁暂存。我不想逐个浏览每个补丁;我只想告诉git“暂存第2、4、6、8等补丁”。
这也可以在尝试与Sourcetree(它启用了对补丁的处理)互动时使用自定义脚本时非常有用。

1
分段暂存(相对于整个文件而言)只有在交互式设置中才有意义。编程上,你如何知道确实是第二个分段需要进行暂存呢? - jub0bs
1
@Jubobs,假设我正在编辑一个冗长而重复的JSON文件或其他什么东西,并且我知道在查看git diff输出后,我想要暂存每个其他块。因此,我已经通过运行git diff进行了“交互”,但现在我只想一次性地暂存一堆块,而不是逐个浏览它们。 - Ben Cook
好的,这样更有意义。您应该编辑您的问题并添加这个解释。 - jub0bs
2个回答

3

如果您能够手动或自动地编辑您的补丁(通过git diff产生),您可以使用以下命令非交互式地暂存差异块,例如使用sed

git apply --cached patchfile

PS: 我实际上可以在这里找到你问题的答案:https://dev59.com/0o3da4cB1Zd3GeqPwCke#31498768


1
这个答案更多是为了练习和找到解决方案的有趣性而写的。我不确定它是否真的可以应用于实际情况。它还展示了如何在给定所需选择列表的情况下使用git add -p的解决方案。 git add --patch从stdin读取,因此您可以准备交互操作,比如在一个文件中(以/tmp/foo为例),每行都是您想要的块操作,然后执行以下操作:
git add -p < /tmp/foo

以下是一个完整的示例:

我创建了一个文件,每行都有一个从0到100的数字,提交了它,并将0替换为a。差异的开头看起来像这样:

diff --git a/my-file b/my-file
index 3b53b00..8f9a65c 100644
--- a/my-file
+++ b/my-file
@@ -1,4 +1,4 @@
-0
+a
 1
 2
 3
@@ -8,7 +8,7 @@
 7
 8
 9
-10
+1a
 11
 12
 13
@@ -18,7 +18,7 @@
 17
 18
 19
-20
+2a
 21
 22
 23
@@ -28,7 +28,7 @@
 27
 28
 29
-30
+3a
 31
 32
 33
@@ -38,7 +38,7 @@
 37
 38
 39
-40
+4a
 41
 42
 43

现在,我只想执行两个更改中的一个,然后创建我的foo文件:
echo `y
n
y
n
y
n
y
n
y
n
y' > /tmp/foo

这个文件的创建可以自动化或手动完成。
然后我运行它:
git add -p < /tmp/foo

然后我被分阶段执行:

> git diff --cached
diff --git a/my-file b/my-file
index 3b53b00..00010f9 100644
--- a/my-file
+++ b/my-file
@@ -1,4 +1,4 @@
-0
+a
 1
 2
 3
@@ -18,7 +18,7 @@
 17
 18
 19
-20
+2a
 21
 22
 23
@@ -38,7 +38,7 @@
 37
 38
 39
-40
+4a
 41
 42
 43
[.....]

和未暂存:

> git diff
diff --git a/my-file b/my-file
index 3b53b00..00010f9 100644
--- a/my-file
+++ b/my-file
@@ -1,4 +1,4 @@
-0
+a
 1
 2
 3
@@ -18,7 +18,7 @@
 17
 18
 19
-20
+2a
 21
 22
 23
@@ -38,7 +38,7 @@
 37
 38
 39
-40
+4a
 41
 42
 43
[...]

不使用文件的另一种方法是:

echo 'y
n
y
n
y
n
y
n
y
n
y' | git add --patch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接