Я заметил это странное поведение 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
...