Para dar a você o histórico, estou tentando "portar" o fluxo de trabalho "confirmar apenas partes de partes" de git
para svn
.
Em git
existe uma simulação interativa, e você pode até mesmo editar hunks para serem cometidos (escolha quais partes de hunks para commitar, ou até mesmo commitar algo que não estava no hunk inicialmente). Em svn
não existe tal coisa, mas você pode diff
/ patch
.
Agora vamos fazer alguns testes. O primeiro script cria um repositório com um commit, edita o arquivo e executa o teste interativo:
#!/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
Execute o script e, quando perguntado sobre o que fazer com o hunk, escolha "edit", remova a linha "+222" e saia do editor. Você verá:
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
O segundo script cria um patch semelhante, remove a linha "+222" e tenta aplicar o patch resultante:
#!/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
Mas isso falha:
--- 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:
Existe uma maneira de fazê-lo funcionar sem editar manualmente @@ -1,2 +1,5 @@
parts?
Tags git patch subversion