Какой формат у файла патча?

Что означает следующее?

diff -rBNu src.orig/java/org/apache/nutch/analysis/NutchAnalysisConstants.java src/java/org/apache/nutch/analysis/NutchAnalysisConstants.java
--- src.orig/java/org/apache/nutch/analysis/NutchAnalysisConstants.java 2009-03-10 11:34:01.000000000 -0700
+++ src/java/org/apache/nutch/analysis/NutchAnalysisConstants.java  2009-03-10 14:11:55.000000000 -0700
@@ -4,9 +4,12 @@

+  int CJK = 21;
+  int DIGIT = 22;

   int DEFAULT = 0;

   String[] tokenImage = {
     "<EOF>",
+    "\"OR\"",
     "<WORD>",
     "<ACRONYM>",
     "<SIGRAM>",
@@ -39,6 +42,8 @@
     "\"\\\"\"",
     "\":\"",
     "\"/\"",
+    "\"(\"",
+    "\")\"",
     "\".\"",
     "\"@\"",
     "\"\\\'\"",

person omg    schedule 12.06.2009    source источник
comment
для git: stackoverflow.com/questions/2529441/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 24.07.2015
comment
См. документы GNU. .и полную версию   -  person Eric Mutta    schedule 13.06.2021


Ответы (4)


Используемая вами опция -u указывает единый формат. В этом формате первые две строки представляют собой заголовок: --- - исходный файл, +++ - новый файл и временные метки.

@@ заголовки блоков

Затем следуют фрагменты (фрагменты изменения), которые начинаются с синтаксиса @@ -R,r +R,r @@.

Это два диапазона: один с - - это диапазон для фрагмента в исходном файле, а другой с + - диапазон в новом файле. R обозначает номер строки, в которой запускается операция сравнения.

Цифры после запятой - это количество затронутых строк в каждом файле.

  • Каждый раз, когда вы удаляете строку, число +r будет меньше, чем -r.
  • Каждый раз, когда вы добавляете строку, число +r будет больше, чем -r
  • При изменении строки к числу +r добавляется 0. (тот же объем строк)

Куски строк кода

Внутри этих фрагментов строки обозначены как добавления или удаления, - означает удаление, + означает добавление. Строки, которые не изменились в этом фрагменте, не будут иметь перед ним ни +, ни -.

В вашем примере это означает, что есть два фрагмента или раздела, которые изменились между двумя файлами, и строки с + в нем - это новые добавленные, ничего не было удалено.

Вы можете найти гораздо больше информации о синтаксисе, выполнив поиск в Google по запросу unified diff.

person Andre Miller    schedule 12.06.2009
comment
Вы упомянули синтаксис @@ -R + R @@, но на самом деле это @@ -R, r + R, r @@, что означает другой номер? - person omg; 12.06.2009
comment
числа после запятой - это количество затронутых строк в каждом файле. Каждый раз, когда вы удаляете строку, число +r будет меньше -r. Каждый раз, когда вы добавляете строку, число +r будет больше, чем -r - person New Alexandria; 06.03.2014
comment
@NewAlexandria Я бы переформатировал это так, чтобы при перечислении элементов каждый элемент находился в отдельной строке с отступом. - person Bob; 27.04.2016
comment
@AndreMiller, как определить, что строки не добавляются, не удаляются, не изменяются отдельно в git diff ' - person Kasun Siyambalapitiya; 07.12.2016
comment
Lines that did not change in that chunk will have neither + or - front of it. Думаю, было бы точнее / конкретнее сказать, что перед ним будет место. Это важно, потому что, если строка в измененном файле начинается с @@, ее не следует путать с синтаксисом diff. - person Nateowami; 14.03.2017
comment
Альтернативное объяснение r: -r - это количество строк в фрагменте исходного файла; +r - количество строк в фрагменте нового файла. По сути, подсчитайте количество строк в блоке до и после изменения. - person poke; 07.03.2018

Старое имя файла

--- src.orig/java/org/apache/nutch/analysis/NutchAnalysisConstants.java 2009-03-10 11:34:01.000000000 -0700

Новое имя файла

+++ src/java/org/apache/nutch/analysis/NutchAnalysisConstants.java  2009-03-10 14:11:55.000000000 -0700
  • -4: чанк начинается со строки 4 в старом файле (включая строки контекста);
  • 9: количество строк в чанке в старом файле, включая строки контекста (итого всего строк, перед которыми стоит - или ничего);
  • +4: чанк начинается со строки 4 в новом файле;
  • 12: количество строк в блоке в новом файле, включая строки контекста (общее количество строк, перед которыми стоит + или ничего).

Примечание: я изменил разницу, чтобы включить измененную строку, поэтому за удаленной строкой следовала добавленная строка.

@@ -4,9 +4,12 @@

+  int CJK = 21;
+  int DIGIT = 22;

-  int DEFAULT = 0;
+  int DEFAULT = 42;

   String[] tokenImage = {
     "<EOF>",
+    "\"OR\"",
     "<WORD>",
     "<ACRONYM>",
     "<SIGRAM>",

То же, что и выше, но обратите внимание, что фрагмент в новом файле начинается на 3 строки дальше, потому что предыдущий фрагмент добавил чистую стоимость 3 строки.

@@ -39,6 +42,8 @@
     "\"\\\"\"",
     "\":\"",
     "\"/\"",
+    "\"(\"",
+    "\")\"",
     "\".\"",
     "\"@\"",
     "\"\\\'\"",
person qwertzguy    schedule 15.12.2016
comment
Спасибо за объяснение 9 и 12 в этом примере. - person Ask and Learn; 28.10.2019

Символы + означают, что эти строки были добавлены с момента последней версии NutchAnalysisConstants.java. Строка @@ сообщает вам, что разница перешла в другой раздел файла, в данном случае на строку 39 в оригинале или на строку 43 в новом.

person John G    schedule 12.06.2009
comment
@@ -39,6 +43,8 @@ что конкретно означают 6 и 8? - person omg; 12.06.2009
comment
Это количество строк, к которым применяется фрагмент изменения для соответствующего файла. Таким образом, для старого файла он применяется к 6 строкам, по сравнению с 8 для нового файла. - person John G; 12.06.2009
comment
Но оказывается, что новый файл не изменен, это намеренно? - person omg; 12.06.2009

Это зависит от того, о чем вы спрашиваете. Diff показывает разницу между двумя файлами. В вашем случае вы различаете NutchAnalysisConstants.java из двух разных мест и генерируете информацию об этих различиях.

-r to diff означает «рекурсивный diff», хотя в данном случае он ничего не делает, поскольку вы сравниваете файлы, а не каталоги.

-B означает игнорировать изменения, которые касаются только пустых строк.

-N означает, что если в каталоге1 у меня есть файл, но его нет в каталоге2, diff должен обрабатывать его так, как если бы файл присутствует, но пуст в каталоге2 (таким образом, вы получаете полное содержимое файла в каталоге1).

-u означает использование единого формата вывода, который поддерживается только GNU diff и GNU patch.

Что касается вывода, эта ссылка может быть полезно для вас.

person FreeMemory    schedule 12.06.2009
comment
Ссылка не найдена. Пожалуйста, исправьте свой комментарий - person Quamis; 21.04.2016