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(可以使用帅哥)进行交互时,这也很有用。
答案 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