Использование diff и patch, чтобы одна локальная кодовая база выглядела как другая - PullRequest
0 голосов
/ 16 марта 2010

Я заметил это странное поведение diff и patch, когда я использовал их, чтобы одна база кода была идентична другой. Допустим, я хочу обновить update_me, чтобы он выглядел идентично left_unchanged. Я иду на update_me. Я запускаю различие от оставляемого к началу к обновлению. Затем я добавляю diff в update_me. Если в файле left_unchanged есть новые файлы, patch спрашивает меня, был ли мой патч полностью изменен! Если я отвечаю «да», он удаляет новые файлы в файле left_unchanged. Затем, если я просто перезапущу исправление, оно исправит исправление update_me.

Почему патч пытается изменить и листья, и обновления? И 1003 *

Как правильно это сделать? Я нашел хакерский способ, который заключается в замене всех строк +++ на бессмысленные пути, чтобы патч не смог найти left_unchanged. Тогда все работает нормально. Это такое уродливое решение.

$ mkdir copyfrom
$ mkdir copyto
$ echo "Hello world" > copyfrom/myFile.txt
$ cd copyto
$ diff -Naur . ../copyfrom > my.diff
$ less my.diff

diff -Naur ./myFile.txt ../copyfrom/myFile.txt
--- ./myFile.txt        1969-12-31 19:00:00.000000000 -0500
+++ ../copyfrom/myFile.txt      2010-03-15 17:21:22.000000000 -0400
@@ -0,0 +1 @@
+Hello world

$ patch -p0 < my.diff

The next patch would create the file ../copyfrom/myFile.txt,
which already exists!  Assume -R? [n] yes
patching file ../copyfrom/myFile.txt

$ patch -p0 < my.diff
patching file ./myFile.txt

Редактировать

Я заметил, что Mercurial избегает этой проблемы, предварительно ожидая каталоги "a" и "b".

$ hg diff
--- a/crowdsourcing/models.py   Mon Jun 14 17:18:46 2010 -0400
+++ b/crowdsourcing/models.py   Thu Jun 17 11:08:42 2010 -0400
...

1 Ответ

2 голосов
/ 19 октября 2010

Я полагаю, что ответ здесь - выполнить ваш diff в родительском каталоге. Затем используйте патч -p1 для удаления этого первого сегмента. Я полагаю, что именно поэтому опция patch в полосе на самом деле по умолчанию равна 1, а не 0. Например. использовать ваш пример сверху

$ mkdir copyfrom
$ mkdir copyto
$ echo "Hello world" > copyfrom/myFile.txt
$ diff -Naur copyto copyfrom > my.diff
$ less my.diff

diff -Naur copyto/myFile.txt copyfrom/myFile.txt
--- copyto/myFile.txt    1970-01-01 12:00:00.000000000 +1200
+++ copyfrom/myFile.txt    2010-10-19 10:03:43.000000000 +1300
@@ -0,0 +1 @@
+Hello world

$ cd copyto
$ patch -p1 < ../my.diff

Единственное отличие от вашего примера в том, что я выполнил diff из родительского каталога, так что сравниваемые каталоги находятся на одном уровне.

...