Ответ 1
С помощью git -svn вы можете создать локальный репозиторий хранилищ SVN удаленного хранилища SVN, работать с ним, используя полный набор функций GIT (включая частичные коммиты), а затем вернуть его обратно в репозиторий SVN.
Учитывая случай, я сделал два независимых изменения в одном файле: например. добавил новый метод и изменил другой метод.
Я часто не хочу фиксировать оба изменения как один, но как два независимые коммиты.
В репозитории git я бы использовал Интерактивный режим git -add (1) разбить кусок на более мелкие:
git add --patch
Какой самый простой способ сделать это с помощью Subversion? (Возможно, даже с помощью плагина Eclipse)
Update:
В The Thing About Git Райан называет это: "Проблема с заданной рабочей копией".
С помощью git -svn вы можете создать локальный репозиторий хранилищ SVN удаленного хранилища SVN, работать с ним, используя полный набор функций GIT (включая частичные коммиты), а затем вернуть его обратно в репозиторий SVN.
Tortoise SVN 1.8 теперь поддерживает это с помощью функции "Восстановить после фиксации". Это позволяет вам вносить изменения в файл, при этом все изменения будут отменены после фиксации
В документации:
Чтобы зафиксировать только части файла, относящиеся к одной конкретной проблеме:
- в диалоговом окне фиксации, щелкните правой кнопкой мыши файл, выберите "restore after commit"
- отредактируйте файл, например. TortoiseMerge: отмените изменения, которые вы еще не хотите совершать.
- сохранить файл
- зафиксировать файл
Я сделал это, используя TortoiseSVN.
Встроенная утилита merge позволяет показать разницу между версией репозитория и вашей рабочей копией.
Используйте функцию создания резервной копии утилиты diff
Теперь вы должны выполнить все свои изменения, используя две отдельные фиксации.
Попробуйте использовать 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) с версии 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. Однако я не пробовал себя.
Я использовал это:
Это упрощенный подход, предполагающий, что один набор изменений достаточно легко отменить. Для более сложных ситуаций я бы отказался и совершил оба изменения, не беспокоясь об этом.
Теперь, когда я использую 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; отлично работает в моем ограниченном опыте.
Это немного рискованнее, чем полное предложение Спайка, но может быть проще сделать. Также убедитесь, что вы попробуете что-то в первую очередь, так как некоторые редакторы откажутся сохранять файл, который был изменен из-под них, если вы не перезагрузите этот файл (потеряв все ваши изменения)
Я думаю, что более простой вариант, чем создание файлов diff, возврат и т.д., состоял бы в том, чтобы выгрузить две копии репозитория и использовать инструмент визуального разграничения, такой как DeltaWalker, для копирования кусков от одного к другому.
Первый экземпляр будет тем, с которым вы действительно работаете, а второй будет только для этой цели. После того, как вы сделали тонну изменений для первого, вы можете скопировать один раздел во второй, скопировать его, скопировать другой раздел, зафиксировать его и т.д.
svn diff
.svn revert
.patch
, либо путем ручного редактирования или что-то еще.diff
, чтобы сравнить вашу рабочую копию с резервной копией, чтобы убедиться, что вы правильно применили исправления.