Использование diff и patch, чтобы заставить одну локальную кодовую базу выглядеть как другая

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

person Dave Aaron Smith    schedule 15.03.2010    source источник


Ответы (1)


Я считаю, что ответ здесь заключается в том, чтобы выполнить ваш diff в родительском каталоге. Затем используйте patch -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 из родительского каталога, так что сравниваемые каталоги находятся на одном уровне.

person EdC    schedule 18.10.2010
comment
Ваш метод работает и тогда, когда есть бинарные файлы. отличный ! Одно замечание: копировать в исходную папку, копировать из измененной. В конце оригинал обновляется, чтобы он был идентичен измененной папке. Советую протестировать полностью на копиях папок, а закончить на diff -Naur copyto copyfrom > my.diff.check. Размер результата должен быть нулевым. - person lalebarde; 13.04.2015