Частичные коммиты с Subversion - PullRequest
98 голосов
/ 16 сентября 2008

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

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

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

 git add --patch

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

Обновление:
В The Thing About Git Райан называет это: «Проблема запутанной рабочей копии».

Ответы [ 11 ]

59 голосов
/ 09 июля 2013

Tortoise SVN 1.8 теперь поддерживает с функцией «Восстановить после фиксации». Это позволяет вам вносить изменения в файл, причем все изменения отменяются после фиксации

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

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

  1. в диалоге фиксации, щелкните правой кнопкой мыши файл, выберите «восстановить после коммита»
  2. редактировать файл, например, TortoiseMerge: отменить изменения, которые вы еще не хотите совершать
  3. сохранить файл
  4. зафиксировать файл
41 голосов
/ 16 сентября 2008

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

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

Используйте функцию create backup утилиты diff

  1. Перейдите к фиксации вашего файла, как будто вы собираетесь зафиксировать все свои изменения.
  2. В окне фиксации дважды щелкните файл, чтобы отобразить разницу.
  3. В настройках diff выберите опцию сделать резервную копию исходного файла .
  4. Щелкните правой кнопкой мыши на изменениях, которые вам не нужны, и выберите команду , используйте другой текстовый блок .
  5. Сохранить разность ровно один раз . Резервная копия будет перезаписываться при каждом сохранении. Вот почему вы хотите сохранить только один раз.
  6. Передать изменения.
  7. Перезаписать оригинал созданным файлом .bak (в котором будут все ваши исходные изменения).
  8. Зафиксируйте ваш файл.

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

32 голосов
/ 16 сентября 2008

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

GIT-SVN (1)

24 голосов
/ 16 сентября 2008

Попробуйте использовать 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 и проверьте, чтобы убедиться, что все хорошо.

10 голосов
/ 08 октября 2013

Это возможно при использовании TortoiseSvn (Windows) начиная с v1.8.

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

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

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

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

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

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

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

7 голосов
/ 16 сентября 2008

Раньше я делал это:

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

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

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

4 голосов
/ 16 сентября 2008

Я использую либо локальный репозиторий 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; отлично работает в моем ограниченном опыте.

3 голосов
/ 23 марта 2018

Попробуйте VisualSVN для Visual Studio . последняя версия 6.1 представляет функцию QuickCommit. Вы можете частично зафиксировать выбранные изменения в файле, используя новые команды контекстного меню Commit this Block и Commit Selection в редакторе Visual Studio.

enter image description here

2 голосов
/ 20 января 2009
  1. Откройте все файлы, которые вы хотите разделить в редакторе выбора
  2. Используя другой набор инструментов (в Win используйте предложение Спайка (старая версия)), верните второй набор
  3. Commit
  4. вернитесь в выбранный вами редактор и сохраните все файлы

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

0 голосов
/ 13 октября 2017
  1. Копировать все измененные файлы в резервные копии.
  2. Создать патч рабочего состояния, используя svn diff.
  3. Вернуть файлы, используя svn revert.
  4. Повторно примените части патча, которые вы хотите зафиксировать, либо с помощью инструмента patch, либо путем ручного редактирования, либо как угодно.
  5. Запустите diff, чтобы сравнить свою рабочую копию с резервной копией, чтобы убедиться, что вы правильно применили детали патча.
  6. Сборка и тестирование.
  7. Commit.
  8. Скопируйте ваши резервные копии обратно в хранилище.
  9. Повторите в 2. (не в 1.!), Пока не будет сделано.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...