Частичные операции с Subversion

Учитывая случай, я сделал два независимых изменения в одном файле: например. добавил новый метод и изменил другой метод.

Я часто не хочу фиксировать оба изменения как один, но как два независимые коммиты.

В репозитории git я бы использовал Интерактивный режим git -add (1) разбить кусок на более мелкие:

 git add --patch

Какой самый простой способ сделать это с помощью Subversion? (Возможно, даже с помощью плагина Eclipse)

Update:
В The Thing About Git Райан называет это: "Проблема с заданной рабочей копией".

Ответ 1

С помощью git -svn вы можете создать локальный репозиторий хранилищ SVN удаленного хранилища SVN, работать с ним, используя полный набор функций GIT (включая частичные коммиты), а затем вернуть его обратно в репозиторий SVN.

git -svn (1)

Ответ 2

Tortoise SVN 1.8 теперь поддерживает это с помощью функции "Восстановить после фиксации". Это позволяет вам вносить изменения в файл, при этом все изменения будут отменены после фиксации

В документации:

Чтобы зафиксировать только части файла, относящиеся к одной конкретной проблеме:

  • в диалоговом окне фиксации, щелкните правой кнопкой мыши файл, выберите "restore after commit"
  • отредактируйте файл, например. TortoiseMerge: отмените изменения, которые вы еще не хотите совершать.
  • сохранить файл
  • зафиксировать файл

Ответ 3

Я сделал это, используя TortoiseSVN.

Встроенная утилита merge позволяет показать разницу между версией репозитория и вашей рабочей копией.

Используйте функцию создания резервной копии утилиты diff

  • Перейдите к фиксации вашего файла, как будто вы собираетесь выполнить все ваши изменения.
  • В окне фиксации дважды щелкните файл, чтобы показать diff.
  • В настройках diff выберите вариант резервного копирования исходного файла.
  • Щелкните правой кнопкой мыши изменения, которые вы не хотите, и используйте select, чтобы использовать другой текстовый блок.
  • Сохранить diff ровно один раз. Резервная копия будет перезаписана каждый раз при сохранении. Вот почему вы хотите сохранить только один раз.
  • Зафиксируйте изменения.
  • Перезаписать оригинал с созданным файлом .bak(который будет иметь все ваши первоначальные изменения).
  • Зафиксируйте свой файл.

Теперь вы должны выполнить все свои изменения, используя две отдельные фиксации.

Ответ 4

Попробуйте использовать svn diff > out.patch, затем скопируйте файл out.patch в out.patch.add и out.patch.modify

Только когда у вас есть рабочий файл патча, верните исходный файл с помощью svn revert out.c.

Отредактируйте файлы патчей вручную, чтобы они содержали только ханки для добавления или изменения. Примените их к исходному файлу с помощью команды patch, проверьте, работает ли сложение, а затем svn commit добавление.

Повторите промывку для патча out.patch.modify.

Если изменения являются отдельными в файле, так как ваш первоначальный вопрос указан - добавлен новый метод, изменился существующий метод - это будет работать

Это очень утомительное решение - хотя я не уверен, что у вас должна быть какая-то причина для разделения ваших коммитов.

Вы также могли бы проверить несколько рабочих копий того же источника, чтобы применить свою работу против:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Обязательно svn up и проверьте, чтобы все было хорошо.

Ответ 5

Это возможно с помощью TortoiseSvn (Windows) с версии v.1.8.

4.4.1. Диалог фиксации

Если ваша рабочая копия обновлена ​​и конфликтов нет, вы готовы зафиксировать свои изменения. Выберите любой файл и/или папки, которые вы хотите совершить, затем TortoiseSVN → Commit....

< надрез >

4.4.3. Зафиксировать только части файлов

Иногда вы хотите только зафиксировать части изменений, внесенных вами в файл. Такая ситуация обычно происходит, когда вы работаете над чем-то, но затем требуется срочное исправление чтобы быть совершенным, и это исправление происходит в том же файле, который вы работа над.

щелкните правой кнопкой мыши на файле и используйте контекстное меню → Восстановить после фиксации. Это создаст копию файла, как есть. Затем вы можете редактировать файл, например. в TortoiseMerge и отменить все изменения, которые вы не хотите совершить. После сохранения этих изменений вы можете зафиксировать файл.

После совершения фиксации копия файла восстанавливается автоматически, и у вас есть файл со всеми вашими изменениями, которые не были возвращены.

В Linux я бы попробовал http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php. Однако я не пробовал себя.

Ответ 6

Я использовал это:

  • В моем редакторе (я использую vim) отредактируйте файл так, чтобы отображалось только одно из них.
  • Сохраните файл (но не выходите из редактора)
  • Закрепить измененный файл на svn
  • Хит "отменить" в редакторе достаточно времени для повторного появления второго набора изменений
  • Сохранить файл снова
  • Завершить второй набор изменений.

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

Теперь, когда я использую git, я надеюсь, что мне больше никогда не придется делать!

Ответ 7

Я использую либо локальное реплирование darcs, либо просто сменяю изменения постепенно. При слиянии (opendiff открывает FileMerge, программу слияния, которая поставляется с Xcode, замените вашим любимым инструментом слияния):

cp file file.new
svn revert file
opendiff file.new file -merge file

объединить связанные изменения, сохранить слияние, выйти из программы слияния

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

если в файле больше одного не связанного с ним файла, прополоскать и повторить (но почему вы так долго до этого не дожидались?!)

Кроме того, если вы знаете git, вы можете использовать git -svn для поддержки локального репозитория git и синхронизации вашего фиксирует главный сервер svn; отлично работает в моем ограниченном опыте.

Ответ 8

  • Откройте все файлы, которые вы хотите разбить в редакторе по выбору.
  • Используя другой набор инструментов (в Win, используйте предложение Спайка (старая версия)) отпустите второй набор
  • Фиксировать
  • вернитесь к своему редактору по выбору и сохраните все файлы

Это немного рискованнее, чем полное предложение Спайка, но может быть проще сделать. Также убедитесь, что вы попробуете что-то в первую очередь, так как некоторые редакторы откажутся сохранять файл, который был изменен из-под них, если вы не перезагрузите этот файл (потеряв все ваши изменения)

Ответ 9

Я думаю, что более простой вариант, чем создание файлов diff, возврат и т.д., состоял бы в том, чтобы выгрузить две копии репозитория и использовать инструмент визуального разграничения, такой как DeltaWalker, для копирования кусков от одного к другому.

Первый экземпляр будет тем, с которым вы действительно работаете, а второй будет только для этой цели. После того, как вы сделали тонну изменений для первого, вы можете скопировать один раздел во второй, скопировать его, скопировать другой раздел, зафиксировать его и т.д.

Ответ 10

  • Скопируйте все измененные файлы в резервные копии.
  • Создайте патч рабочего состояния с помощью svn diff.
  • Отмените файлы с помощью svn revert.
  • Повторно примените части патча, которые вы хотите зафиксировать, либо с помощью инструмента patch, либо путем ручного редактирования или что-то еще.
  • Затем запустите diff, чтобы сравнить вашу рабочую копию с резервной копией, чтобы убедиться, что вы правильно применили исправления.
  • Построение и тестирование.
  • Commit.
  • Скопируйте резервные копии обратно в репозиторий.
  • Повторяйте в 2. (не в 1.!) до завершения.