나는 파일을 가지고 있습니다 a
:
This
file
does
have
an error
in it
that
needs
to be
fixed.
그리고 비슷한 파일 b
:
This
file
does
have
no error
in it
that
needs
to be
fixed.
다음을 사용하여 통합 diff를 만들 수 있습니다 diff -u a b
.
--- a 2018-01-03 14:20:22 +0100
+++ b 2018-01-03 14:20:37 +0100
@@ -2,7 +2,7 @@
file
does
have
-an error
+no error
in it
that
needs
다음을 사용하여 컨텍스트를 각 측면에서 한 줄로 줄일 수도 있습니다 diff -u1 a b
.
--- a 2018-01-03 14:20:22 +0100
+++ b 2018-01-03 14:20:37 +0100
@@ -4,3 +4,3 @@
have
-an error
+no error
in it
두 패치 모두 깔끔하게 적용할 수 있습니다 patch
. 그러나 diff
비대칭 컨텍스트로 패치를 생성하는 방법을 찾지 못했습니다 . 나는 그것이 그렇게 할 수 없다고 가정하고 있습니다. 그래서 변경 전후에 두 줄의 컨텍스트가 있는 패치를 만들기 위해 일부 컨텍스트를 수동으로 제거해 보았습니다.
--- a 2018-01-03 14:20:22 +0100
+++ b 2018-01-03 14:20:37 +0100
@@ -3,4 +3,4 @@
does
have
-an error
+no error
in it
이게 나한테는 효과가 있는 것 같아통합 형식. 그러나 patch
불만을 제기하려면 퍼즈 테스트에 의존해야 합니다.
patching file a
Hunk #1 succeeded at 3 with fuzz 1.
내가 뭔가 잘못하고 있는 걸까요, 아니면 (GNU) 를 만들 수 있는 방법이 없기 patch
때문에 아무도 사용할 것이라고 상상하지 못했기 때문에 비대칭 컨텍스트로 인해 실제로 깨졌 습니까?diff
또한 흥미로운 점은 비대칭성을 반대로 하면(예: 앞에 한 행, 뒤에 두 행) 패치가 작동한다는 것입니다.
--- a 2018-01-03 14:20:22 +0100
+++ b 2018-01-03 14:20:37 +0100
@@ -4,4 +4,4 @@
have
-an error
+no error
in it
that
답변1
답변2
GNU는 patch
접미사 컨텍스트보다 접두사 컨텍스트를 더 좋아하지 않습니다. 간단하지만 추악한 해결 방법은 컨텍스트의 첫 번째 줄을 다음과 같이 작동하지 않는 변경으로 변환하는 것입니다.
--- a 2018-01-03 14:20:22 +0100
+++ b 2018-01-03 14:20:37 +0100
@@ -3,4 +3,4 @@
-does
+does
have
-an error
+no error
in it
이렇게 하면 모든 접두사 컨텍스트가 제거됩니다. 접미사 컨텍스트가 많을 때는 괜찮습니다.
patch
소스코드를 보다가 찾아보니문제가 있는 작품. 깊은 이해 없이 코드에서 접두사 컨텍스트가 이미 처리되는 방식과 유사한 간단한 수정 방법을 알아냈습니다. 이것은 내 출력입니다 git diff
(패치 patch
).
diff --git a/src/patch.c b/src/patch.c
index bba7e0e..e661af1 100644
--- a/src/patch.c
+++ b/src/patch.c
@@ -1171,7 +1171,7 @@ locate_hunk (lin fuzz)
else if (prefix_fuzz < 0)
prefix_fuzz = 0;
- if (suffix_fuzz < 0)
+ if (suffix_fuzz < 0 && pch_first () + pat_lines > input_lines)
{
/* Can only match end of file. */
offset = first_guess - (input_lines - pat_lines + 1);
@@ -1184,6 +1184,8 @@ locate_hunk (lin fuzz)
else
return 0;
}
+ else if (suffix_fuzz < 0)
+ suffix_fuzz = 0;
min_offset = max_pos_offset < 0 ? first_guess - max_where
: max_neg_offset < 0 ? first_guess - min_where
diff --git a/tests/asymmetric-hunks b/tests/asymmetric-hunks
index d6979d9..86e4ef9 100644
--- a/tests/asymmetric-hunks
+++ b/tests/asymmetric-hunks
@@ -77,5 +77,4 @@ seq 1 5 > a
check 'patch < a.diff' <<EOF
patching file a
-Hunk #1 succeeded at 2 with fuzz 1.
EOF
@Patrick Mevzek이 지적했듯이 이미 비대칭 컨텍스트에 대한 회귀 테스트가 있습니다. 따라서 이 부분도 퍼징이 예상되지 않아 수정되었습니다. 불행하게도 병합 테스트도 실패하는 경우가 있는데 그 이유는 모르겠습니다. 이 때문에 패치를 제출할 수 없는 것 같습니다. 더 많은 통찰력을 가진 사람이 더 나은 솔루션을 생각해 낼 수 있다면 좋을 것입니다.