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

Сценарий такой:

  1. svn cp или mv какой-то файл
  2. изменить этот файл
  3. svn diff> mypatch

На другом компьютере (та же рабочая копия, но без изменений):

  1. Попробуйте применить mypatch.
  2. Ошибка -> пытается изменить несуществующий файл.

Как я могу заставить svn diff создавать патч, применимый к патчу, или в этом случае чисто применить патч, созданный svn diff? Я не могу совершить. Я хотел бы сохранить mergeinfo (потому что очевидный обходной путь - добавить файл как совершенно новый, без связи с предыдущим).


person Paweł Hajdan    schedule 25.11.2008    source источник


Ответы (4)


С помощью Subversion вы можете указать, какой двоичный файл diff использовать и параметры, которые ему нужно передать. См. руководство по svn diff.

Вы хотели бы создать обычный файл патча из svn diff, поэтому вы хотите, чтобы svn diff выглядел как обычный diff. Попробуй это:

svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
...
patch -p0 < mypatch

Подтверждение концепции:

echo "newline" >> README.txt
svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
cp README.txt README.txt.patched
svn revert README.txt
patch -p0 < mypatch
diff README.txt README.txt.patched

Никакой разницы в двух файлах после патча нет.

person Ray    schedule 26.11.2008
comment
Это не работает, если между ветвями есть изменения свойств. - person Will Sargent; 10.02.2009
comment
У меня это не работает. Создаваемый файл патча по-прежнему показывает скопированный файл как модификацию исходного файла (например, в нем есть строки, начинающиеся с -, а также строки, которые не начинаются с - или +). Кроме того, попытка исправления дает: 12 из 14 блоков НЕ ОШИБОЧНО - сохранение отказов в файл. Вы пробовали это с исходным файлом, который действительно имеет контент, и с конечным файлом, содержимое которого отличается от исходного файла? - person Garret Wilson; 07.01.2011
comment
я искал то же самое, и это сработало, спасибо - person nivanka; 20.01.2012
comment
Следуя шагам OP (svn mv, изменить новый файл) и вашим командам для сравнения и исправления, я получаю тот же результат, что и заявленный OP - патч жалуется, что новый файл не существует, поэтому он не знает, что исправить. - person DevDaddyNick; 08.07.2017

Если вы хотите избавиться от свойств svn в своих патчах, для этого есть вариант:

svn diff --patch-compatible > mypatch.diff

svn help diff говорит:

  --patch-compatible   : generate diff suitable for generic third-party
                         patch tools; currently the same as
                         --show-copies-as-adds --ignore-properties

Патчи, созданные таким образом, должны быть совместимы со старой доброй простой patch утилитой.

person Apteryx    schedule 26.04.2016
comment
Это было ближе к ожидаемому результату, чем ответ с большим количеством голосов. Он фактически удаляет содержимое из файла, который был перемещен, и добавляет правильные модификации для нового файла. Но он показывает исходный файл как просто измененный и не имеющий содержимого, а новый файл как неверсированный. Тем не менее, это лучший ответ на исходный вопрос, который я видел до сих пор. - person DevDaddyNick; 08.07.2017

Пробовали ли вы вариант --show-copies-as-adds, упомянутый в svn diff и описан на Параметры svn ?.

person Adrian Pronk    schedule 20.03.2013

Не понимая конкретного сценария, над которым вы пытаетесь работать, трудно определить, почему вы хотите это сделать. У меня такое ощущение, что вы пытаетесь внести контролируемые изменения в изолированную среду, чтобы не повлиять на других пользователей / приложения.

Не могли бы вы решить эту проблему с помощью:

  • Создайте ветку для изменения вашего кода
  • Выполните свое копирование / перемещение и изменения на ветке
  • Попросите другую сторону переключиться на эту новую ветку кода и продолжить совместное использование этой ветки.

Когда вы оба согласились с изменениями, объединитесь обратно в ствол с помощью аргумента --reintegrate и rm ветку?

Это будет * поддерживать информацию о слиянии * определять копирование / перемещение и изменения в управлении версиями * по-прежнему изолировать изменения от других пользователей * предотвращать неполные изменения во время шага 2, которые могут быть проблемой, поскольку вы можете просто добавить больше изменений и обновить

person Toby Jackson    schedule 10.10.2012