在git

时间:2015-08-13 15:55:44

标签: git

git add -p命令允许对帅哥或文件的一部分进行交互式分段(https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging)。

有没有办法以非交互方式登台?说,我有这些帅哥:

$ 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这样的单个命令来播放第二个hunk而不通过交互式菜单会很不错。

注意:此处提到了一个解决方案(How to stage chunks non-interactively in git?),但它涉及多个命令以及编辑补丁文件的附加步骤。

这什么时候有用?说我正在编辑一个冗长且重复的JSON文件,在运行git diff之后,我知道我想要每隔一段时间进行一次。我不想单独检查每个大块头;我只是想告诉git"分阶段进行第2,第4,第6,第8等等等。"。

当尝试使用自定义脚本与Sourcetree(可以使用帅哥)进行交互时,这也很有用。

2 个答案:

答案 0 :(得分:1)

如果您能够手动或自动(例如,感谢sed)编辑补丁(感谢git diff制作了补丁),则由于以下原因,您可以非交互式地播放帅哥命令:

git apply --cached patchfile

PS:我实际上可以在这里找到您问题的答案:https://stackoverflow.com/a/31498768/7009806

答案 1 :(得分:1)

这个答案更多是为了练习,也是为了寻找解决方案的乐趣。我不太确定这是否真的可以应用于现实世界的案例。它还展示了一个关于如何使用 git add -p 的解决方案,给出所需选择的列表。

git add --patch 从 stdin 读取,因此您可以准备您的交互操作,例如,在一个文件中(为了示例而调用 /tmp/foo),每一行都是您想要的大块操作,然后执行:

git add -p < /tmp/foo

这是一个完整的例子:

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

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