it-swarm-ru.tech

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

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

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

В репозитории git я бы использовал Interactive Mode of git-add (1) , чтобы разделить hunk на более мелкие:

 git add --patch

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

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

96
Benedikt Waldvogel

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

git-svn (1)

32
jkramer

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

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

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

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

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

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

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

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

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

42
Spike

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

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

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

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

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

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

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

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

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

25
Chris

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

10
parvus

Я делал это:

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

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

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

8
Greg Hewgill

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

5
Aeon

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

 enter image description here

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

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

2
BCS

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

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

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