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

Сценарий:

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

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

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

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

Ответы [ 4 ]

63 голосов
/ 26 ноября 2008

С помощью subversion вы можете указать, какой двоичный файл различий использовать, и какие параметры передать ему. См. руководство по 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

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

9 голосов
/ 27 апреля 2016

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

5 голосов
/ 21 марта 2013

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

0 голосов
/ 10 октября 2012

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

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

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

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

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

...