为了向您提供背景知识,我正在尝试将“移植”“仅提交部分帅哥”工作流程从git
到svn
。
其中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 @@
?