Получите подходящий патч после выполнения svn remove и svn rename - PullRequest
5 голосов
/ 01 сентября 2011
  1. Я удалил некоторые текстовые файлы, используя svn remove.Но svn diff показывает как удаление всего содержимого в файле.Применение патча этого diff только изменяет содержимое, но не удаляет файл.

  2. Я переименовал каталог, содержащий двоичные файлы, используя svn rename.Файл патча от обычного svn diff ничего не делает.

Как заставить svn diff создать файл, который патч будет применять при использовании svn cp или svn mv?

diff subversion diff, включая новые файлы

Оба метода по ссылкам выше только изменяют файлы.Они не удаляются / переименовываются после применения патча.Можно ли получить рабочий патч для вышеуказанных изменений?

Ответы [ 3 ]

5 голосов
/ 13 июня 2012

со страницы руководства patch:

-E или --remove-empty-files Удалите выходные файлы, которые пусты после исправлений был применен. Обычно эта опция не нужна, так как патч может проверить метки времени на заголовке, чтобы определить мой, должен ли файл существовать после исправления. Тем не мение, если входные данные не являются контекстной разницей или патч соответствует в POSIX, patch не удаляет пустые пропатченные файлы если этот параметр не указан. Когда патч удаляет файл, он также пытается удалить любые пустые каталоги предков.

1 голос
/ 03 июня 2015

Я думаю, что вторая проблема OP вызвана ошибкой SVN, которая была исправлена ​​в SVN 1.7.Вы изменяете структуру каталогов (перемещаете, переименовываете, удаляете) и фиксируете ее, но при использовании svn diff исправление кажется «ничего не делать».

У меня возникла эта проблема при удалении каталогов, и симптомыто же самое, поэтому я предполагаю, что мы испытываем ту же «корневую ошибку».Для меня, обновление до svn 1.7 решило это, потому что svn 1.7 генерирует diff (патчи) по-разному.

Некоторые версии svn diff вообще не помещают перемещенные / переименованные / удаленные файлы в diff вообще!

См .: http://svn.haxx.se/dev/archive-2004-03/0333.shtml. В этом архивном сообщении электронной почты из списка SVN DEV показаны разработчики, которые идентифицировали эту проблему, когда-то до выпуска 1.0.1, более десяти лет назад.Если вы следите за веткой, они, похоже, были полны решимости исправить это тогда, но даже 1.6 также оставляло вещи вне различий.Мне пришлось обновить до 1.7.

По сути, если svn <1.7 обнаружит, что каталог <code>svn delete ', он не будет рекурсировать и обрабатывать дочерние элементы, он просто остановится и ничего не поместит под это.дерево в дифф.Это не то, что нам нужно, мы хотим явного удаления для ВСЕХ дочерних элементов, чтобы патч, как упоминалось в другом ответе, удалял пустые файлы и каталоги через -E.Патч ничего не может сделать, если файл отсутствует в патче.

Использование SVN 1.7 Я сделал идентичный diff, как и раньше, но каждый файл в удаленном каталоге был явно в патче как имеющий все строкиудален (очищен), а затем patch / quilt успешно удалил файлы и папки.Я предполагаю, что нечто подобное должно произойти в вашем случае с перемещением или переименованием.

GOTCHAS: Обновление до 1.7 оставит ваши рабочие копии бесполезными. Убедитесь, что вы зафиксировали свои изменения перед обновлением.Затем вам нужно снова оформить заказ. Редактировать: Клиент SVN 1.7 может восстановить ваши рабочие каталоги, но если это невозможно, вам, возможно, придется снова оформить заказ.Просто будьте осторожны, чтобы не потерять работу.

1 голос
/ 25 ноября 2013

Попробуйте это:

patch -p0 -E < 1.patch && svn rm `svn st -q | grep ^! | cut -c 9-`
...