Вопрос:

Частичные коммиты с Subversion

svn git

24543 просмотра

11 ответа

8548 Репутация автора

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

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

На репозиторий я хотел бы использовать в интерактивном режиме из GIT-дополнения (1) , чтобы разделить кусок на более мелкие:

 git add --patch

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

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

Автор: Benedikt Waldvogel Источник Размещён: 16.09.2008 07:07

Ответы (11)


7 плюса

719025 Репутация автора

Я имел обыкновение делать это:

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

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

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

Автор: Greg Hewgill Размещён: 16.09.2008 07:13

41 плюса

544 Репутация автора

Я сделал это с помощью TortoiseSVN .

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

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

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

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

Автор: Spike Размещён: 16.09.2008 07:16

4 плюса

5567 Репутация автора

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

Автор: Aeon Размещён: 16.09.2008 07:18

24 плюса

241 Репутация автора

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

Автор: Chris Размещён: 16.09.2008 07:21

34 плюса

12149 Репутация автора

Решение

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

мерзавец (1)

Автор: jkramer Размещён: 16.09.2008 07:37

2 плюса

34753 Репутация автора

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

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

Автор: BCS Размещён: 20.01.2009 05:45

59 плюса

51957 Репутация автора

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

Согласно документации:

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

  1. в диалоге фиксации щелкните правой кнопкой мыши файл, выберите «восстановить после фиксации»
  2. отредактируйте файл, например, в TortoiseMerge: отмените изменения, которые вы еще не хотите фиксировать
  3. сохранить файл
  4. зафиксировать файл
Автор: Casebash Размещён: 09.07.2013 01:27

11 плюса

3541 Репутация автора

Это возможно при использовании 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 . Хотя сам не пробовал.

Автор: parvus Размещён: 08.10.2013 06:40

0 плюса

1876 Репутация автора

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

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

Автор: Ian Dunn Размещён: 12.02.2016 07:35

0 плюса

743 Репутация автора

  1. Скопируйте все измененные файлы в резервные копии.
  2. Создать патч рабочего состояния используя svn diff.
  3. Вернуть файлы с помощью svn revert.
  4. Повторно примените части патча, которые вы хотите зафиксировать, либо с помощью patchинструмента, либо путем ручного редактирования, либо как угодно.
  5. Запустите diffвпоследствии, чтобы сравнить вашу рабочую копию с резервной копией, чтобы убедиться, что вы правильно применили детали патча.
  6. Сборка и тестирование.
  7. Commit.
  8. Скопируйте ваши резервные копии обратно в хранилище.
  9. Повторите в 2. (не в 1.!), Пока не сделано.
Автор: michaeljt Размещён: 13.10.2017 02:10

4 плюса

23533 Репутация автора

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

введите описание изображения здесь

Автор: bahrep Размещён: 23.03.2018 02:49
Вопросы из категории :
32x32