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

Сценарий:

  • svn cp или mv некоторый файл
  • изменить этот файл
  • svn diff > mypatch

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

  1. Попробуйте применить mypatch.
  2. Сбой → пытается изменить неиспользуемый файл.

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

Ответ 1

С 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

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

Ответ 2

Если вы хотите избавиться от свойств 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.

Ответ 3

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

Ответ 4

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

Не удалось решить эту проблему:

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

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

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