Я заметил это странное поведение diff и patch, когда использовал их, чтобы заставить одну кодовую базу быть идентичной другой. Допустим, я хочу обновить update_me, чтобы он выглядел так же, как и leave_unchanged. Я захожу на update_me. Я запускаю diff от leave_unchanged к update_me. Затем я исправляю diff в update_me. Если есть новые файлы в leave_unchanged, патч спрашивает меня, был ли мой патч перевернут! Если я отвечу да, он удалит новые файлы в leave_unchanged. Затем, если я просто перезапущу патч, он корректно исправляет update_me.
Почему patch пытается изменить и leave_unchanged, и update_me?
Как правильно это сделать? Я нашел хакерский способ, который состоит в том, чтобы заменить все строки +++ бессмысленными путями, чтобы патч не мог найти leave_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
...