Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Paweł HajdanОтветов: 4

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

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

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

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

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

mergepatchsvndiff

Ответы

Ответ 1 · рейтинг 64 · Ray

С помощью 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 · рейтинг 11 · Apteryx

Если вы хотите избавиться от свойств 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 · рейтинг 5 · Adrian Pronk

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

Ответ 4 · рейтинг -1 · Toby Jackson

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы