如何让补丁不那么严格?

如何让补丁不那么严格?

为了向您提供背景知识,我正在尝试将“移植”“仅提交部分帅哥”工作流程从gitsvn

其中git有交互式分段,您甚至可以编辑要提交的块(选择要提交块的哪些部分,甚至提交最初不在块中的内容)。没有svn这样的东西,但你可以diff/ patch

现在让我们做一些测试。第一个脚本通过一次提交创建一个存储库,编辑文件并运行交互式暂存:

#!/usr/bin/env bash
set -eu
rm -rf 1   # !!! it removes dir `1`
mkdir 1
cd "$_"
git init
echo 'aaa
bbb' > 1
git add 1
git ci -am c1
sed -i 's/aaa/aaa\n111\n222\n333/' 1
git add -p
git --no-pager diff
git --no-pager diff --cached

运行脚本,当询问如何处理该块时,选择“编辑”,删除“+222”行,然后退出编辑器。你会看见:

Initialized empty Git repository in /home/yuri/_/1/1/.git/
[master (root-commit) 1274f4f] c1
 1 file changed, 2 insertions(+)
 create mode 100644 1
diff --git a/1 b/1
index dbee026..5c89250 100644
--- a/1
+++ b/1
@@ -1,2 +1,5 @@
 aaa
+111
+222
+333
 bbb
Stage this hunk [y,n,q,a,d,/,e,?]? e

diff --git a/1 b/1
index f1dea50..5c89250 100644
--- a/1
+++ b/1
@@ -1,4 +1,5 @@
 aaa
 111
+222
 333
 bbb
diff --git a/1 b/1
index dbee026..f1dea50 100644
--- a/1
+++ b/1
@@ -1,2 +1,4 @@
 aaa
+111
+333
 bbb

第二个脚本创建类似的补丁,删除行“+222”并尝试应用生成的补丁:

#!/usr/bin/env bash
set -eu
rm -rf 2   # !!! it removes dir `2`
mkdir 2
cd "$_"
echo 'aaa
bbb' > 1
echo 'aaa
111
222
333
bbb' > 2
diff -u 1 2 > 1.patch || true
cat 1.patch
sed -En -i '/\+222/!p' 1.patch
cat 1.patch
patch -p0 < 1.patch

但它失败了:

--- 1   2015-12-04 21:52:58.815274483 +0200
+++ 2   2015-12-04 21:52:58.815274483 +0200
@@ -1,2 +1,5 @@
 aaa
+111
+222
+333
 bbb
--- 1   2015-12-04 21:52:58.815274483 +0200
+++ 2   2015-12-04 21:52:58.815274483 +0200
@@ -1,2 +1,5 @@
 aaa
+111
+333
 bbb
patching file 1
patch: **** malformed patch at line 7:  

有没有办法让它在不手动编辑零件的情况下工作@@ -1,2 +1,5 @@

相关内容