Частичные коммиты с помощью Subversion
Вопрос
Учитывая то дело, которое я выдвинул два независимых изменения в один файл:например.добавлен новый метод и изменен другой метод.
Я часто не хочу фиксировать оба изменения как один совершать, но как два независимые коммиты.
В репозитории git я бы использовал Интерактивный режим из git-добавить(1) чтобы разделить ломоть на более мелкие:
git add --patch
Какой самый простой способ сделать это с помощью Subversion?(Возможно, даже с использованием плагина Eclipse)
Обновить:
В Фишка В Git, Райан называет это: “Запутанная проблема с рабочей копией”.
Решение
С помощью git-svn вы можете создать локальный репозиторий GIT из удаленного репозитория SVN, работать с ним, используя полный набор функций GIT (включая частичные коммиты), а затем отправить все это обратно в репозиторий SVN.
Другие советы
Черепаха SVN 1.8 теперь поддерживает это с помощью функции "Восстановить после фиксации".Это позволяет вам вносить изменения в файл, при этом все изменения отменяются после фиксации
Согласно документации:
Фиксировать только те части файла, которые относятся к одной конкретной проблеме:
- в диалоговом окне фиксации щелкните правой кнопкой мыши на файле и выберите "восстановить после фиксации".
- отредактируйте файл, например, вЧерепашье слияние:отмените изменения, которые вы пока не хотите фиксировать
- сохраните файл
- зафиксируйте файл
Я сделал это с помощью TortoiseSVN.
Встроенная утилита слияния позволяет вам показать разницу между версией репозитория и вашей рабочей копией.
Используйте создать резервную копию функция утилиты diff
- Перейдите к фиксации вашего файла, как если бы вы собирались зафиксировать все свои изменения.
- В окне фиксации дважды щелкните файл, чтобы отобразить разницу.
- В настройках различий выберите опцию, чтобы создайте резервную копию исходного файла.
- Щелкните правой кнопкой мыши изменения, которые вам не нужны, и используйте команду выбрать использовать другой текстовый блок.
- Сохраните разницу ровно один раз.Резервная копия будет перезаписываться при каждом сохранении.Вот почему вы хотите сохранить только один раз.
- Зафиксируйте изменение.
- Замените оригинал созданным файлом .bak (в котором будут все ваши исходные изменения).
- Зафиксируйте ваш файл.
Теперь вы должны зафиксировать все свои изменения, используя два отдельных коммита.
Попробуйте использовать 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
и протестируйте, чтобы убедиться, что все в порядке.
Это возможно с помощью TortoiseSVN (Windows) начиная с версии v1.8.
4.4.1.Диалоговое окно Фиксации
Если ваша рабочая копия обновлена и конфликтов нет, вы готовы зафиксировать свои изменения.Выберите любой файл и / или папки, которые вы хотите зафиксировать, затем TortoiseSVN → Зафиксировать....
<snip>
4.4.3.Фиксируйте только части файлов
Иногда вы хотите зафиксировать в файле только часть внесенных вами изменений.Такая ситуация обычно возникает, когда вы работаете над чем-то, но затем требуется срочное исправление , которое необходимо зафиксировать, и это исправление находится в том же файле, над которым вы работаете.
щелкните правой кнопкой мыши на файле и выберите Контекстное меню → Восстановить после фиксации.Это создаст копию файла таким, какой он есть.Затем вы можете отредактировать файл , напримерв TortoiseMerge и отмените все изменения, которые вы не хотите фиксировать .После сохранения этих изменений вы можете зафиксировать файл.
После завершения фиксации копия файла восстанавливается автоматически, и у вас есть файл со всеми вашими изменениями, которые не были зафиксированы обратно.
В Linux я бы дал http://webstaff.itn.liu.se /~karlu20/div/blog/2013-05-31_SVNPartialCommit.php попробовать.Хотя сам я этого еще не пробовал.
Я привык делать это:
- В моем редакторе (я использую vim) отредактируйте файл так, чтобы появилось только одно из изменений
- Сохраните файл (но не выходите из редактора).
- Зафиксируйте измененный файл в svn
- Нажмите "отменить" в редакторе достаточное количество раз, чтобы снова появился второй набор изменений
- Сохраните файл еще раз
- Зафиксируйте второй набор изменений.
Это упрощенный подход, который предполагает, что один набор изменений достаточно легко отменить.В более сложных ситуациях я бы сдался и зафиксировал оба изменения, не беспокоясь об этом.
Теперь, когда я использую git, я надеюсь, что мне больше никогда не придется этого делать!
Я использую либо локальное репозиторий 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;по моему ограниченному опыту, это отлично работает.
Попробуй VisualSVN для Visual Studio.Тот Самый последняя версия 6.1 вводится функция быстрой фиксации.Вы можете частично зафиксировать выбранные изменения в файле, используя новый Зафиксируйте этот блок и Выбор фиксации команды контекстного меню в редакторе Visual Studio.
- Откройте все файлы, которые вы хотите разделить, в выбранном редакторе
- Используя другой набор инструментов (в Win используйте предложение Спайка (старая версия)), верните второй набор
- Зафиксировать
- вернитесь к выбранному вами редактору и сохраните все файлы
Это немного рискованнее, чем полное предложение Спайка, но сделать это может быть проще.Также убедитесь, что вы сначала попробуете это на чем-то другом, поскольку некоторые редакторы откажутся сохранять файл, который был изменен из-под них, если вы не перезагрузите этот файл (потеряв все свои изменения).
Я думаю, что более простым вариантом, чем генерация файлов различий, возврат и т.д., Было бы извлечь две копии репозитория и использовать инструмент визуального разделения, такой как DeltaWalker, для копирования фрагментов из одного в другой.
Первая копия будет той, с которой вы на самом деле работаете, а вторая будет предназначена только для этой цели.После того как вы внесли массу изменений в первый, вы можете скопировать один раздел во второй, зафиксировать его, скопировать другой раздел, зафиксировать его и т.д.
- Скопируйте все соответствующие измененные файлы в резервные копии.
- Создайте исправление рабочего состояния, используя
svn diff
. - Верните файлы обратно с помощью
svn revert
. - Повторно примените части патча, которые вы хотите зафиксировать, либо используя
patch
инструментом, или путем ручного редактирования, или что-то еще. - Бежать
diff
после этого сравните вашу рабочую копию с резервной, чтобы убедиться, что вы правильно применили исправления. - Сборка и тестирование.
- Совершить.
- Скопируйте резервные копии обратно в свой репозиторий при извлечении.
- Повторите в 2 раза.(не на уровне 1.!) до готовности.