Частичные коммиты с Subversion
24543 просмотра
11 ответа
Учитывая случай, я сделал два независимых изменения в одном файле: например. добавил новый метод и изменил другой метод.
Я часто не хочу фиксировать оба изменения как один коммит, а как два независимых коммита.
На репозиторий я хотел бы использовать в интерактивном режиме из GIT-дополнения (1) , чтобы разделить кусок на более мелкие:
git add --patch
Какой самый простой способ сделать это с Subversion? (Может быть, даже с помощью плагина Eclipse)
Обновление:
В статье «Что касается Git» Райан называет это «Проблема запутанной рабочей копии».
Ответы (11)
34 плюса
С помощью git-svn вы можете создать локальный GIT-репозиторий удаленного SVN-репозитория, работать с ним, используя полный набор функций GIT (включая частичные коммиты), а затем перенести все это обратно в SVN-репозиторий.
Автор: jkramer Размещён: 16.09.2008 07:3759 плюса
Tortoise SVN 1.8 теперь поддерживает это с помощью функции «Восстановить после фиксации». Это позволяет вам вносить изменения в файл, причем все изменения отменяются после фиксации
Согласно документации:
Автор: Casebash Размещён: 09.07.2013 01:27Чтобы зафиксировать только те части файла, которые относятся к одной конкретной проблеме:
- в диалоге фиксации щелкните правой кнопкой мыши файл, выберите «восстановить после фиксации»
- отредактируйте файл, например, в TortoiseMerge: отмените изменения, которые вы еще не хотите фиксировать
- сохранить файл
- зафиксировать файл
41 плюса
Я сделал это с помощью TortoiseSVN .
Встроенная утилита слияния позволяет вам показать разницу между версией репозитория и вашей рабочей копией.
Используйте функцию создания резервной копии утилиты diff
- Перейдите к фиксации вашего файла, как будто вы собираетесь зафиксировать все свои изменения.
- В окне фиксации дважды щелкните файл, чтобы отобразить diff.
- В настройках diff выберите опцию для резервного копирования исходного файла .
- Щелкните правой кнопкой мыши по изменениям, которые вам не нужны, и выберите « Использовать другой текстовый блок» .
- Сохраните разницу ровно один раз . Резервная копия будет перезаписываться при каждом сохранении. Вот почему вы хотите сохранить только один раз.
- Зафиксируйте изменения.
- Перезаписать оригинал созданным файлом .bak (в котором будут все ваши исходные изменения).
- Зафиксируйте свой файл.
Теперь вы должны зафиксировать все ваши изменения, используя две отдельные фиксации.
Автор: Spike Размещён: 16.09.2008 07:1624 плюса
Попробуйте использовать, 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
и проверьте, чтобы убедиться, что все хорошо.
11 плюса
Это возможно при использовании 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:407 плюса
Я имел обыкновение делать это:
- В моем редакторе (я использую vim) отредактируйте файл так, чтобы отображалось только одно из изменений
- Сохраните файл (но не выходите из редактора)
- Передать измененный файл в SVN
- Хит "отменить" в редакторе достаточно раз, чтобы второй набор изменений снова появился
- Сохраните файл снова
- Зафиксируйте второй набор изменений.
Это упрощенный подход, который предполагает, что один набор изменений достаточно легко отменить. В более сложных ситуациях я бы отказался и зафиксировал оба изменения, не беспокоясь об этом.
Теперь, когда я использую git, надеюсь, мне больше никогда этого не понадобится!
Автор: Greg Hewgill Размещён: 16.09.2008 07:134 плюса
Я использую либо локальный репозиторий 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:184 плюса
Попробуйте VisualSVN для Visual Studio . В последней версии 6.1 представлена функция QuickCommit. Вы можете частично зафиксировать выбранные изменения в файле, используя новые команды контекстного меню Commit this Block и Commit Selection в редакторе Visual Studio.
Автор: bahrep Размещён: 23.03.2018 02:492 плюса
- Откройте все файлы, которые вы хотите разделить в редакторе выбора
- Используя другой набор инструментов (на Win, используйте предложение Спайка (старая версия)), верните второй набор
- совершить
- вернитесь к вашему редактору и сохраните все файлы
Это немного более рискованно, чем полное предложение Спайка, но может быть легче сделать. Также убедитесь, что вы сначала попробовали что-то другое, так как некоторые редакторы откажутся сохранять файл, который изменился из-под них, если вы не перезагрузите этот файл (потеря всех ваших изменений)
Автор: BCS Размещён: 20.01.2009 05:450 плюса
Я думаю, что более простой вариант, чем генерация diff-файлов, возврат и т. Д., Состоит в том, чтобы иметь две проверенные копии репозитория и использовать инструмент визуального сравнения, такой как DeltaWalker, для копирования фрагментов из одного в другой.
Первая копия будет той, с которой вы на самом деле работаете, а вторая будет только для этой цели. После внесения множества изменений в первый вы можете скопировать один раздел во второй, зафиксировать его, скопировать другой раздел, зафиксировать его и т. Д.
Автор: Ian Dunn Размещён: 12.02.2016 07:350 плюса
- Скопируйте все измененные файлы в резервные копии.
- Создать патч рабочего состояния используя
svn diff
. - Вернуть файлы с помощью
svn revert
. - Повторно примените части патча, которые вы хотите зафиксировать, либо с помощью
patch
инструмента, либо путем ручного редактирования, либо как угодно. - Запустите
diff
впоследствии, чтобы сравнить вашу рабочую копию с резервной копией, чтобы убедиться, что вы правильно применили детали патча. - Сборка и тестирование.
- Commit.
- Скопируйте ваши резервные копии обратно в хранилище.
- Повторите в 2. (не в 1.!), Пока не сделано.
Вопросы из категории :
- svn Как мне создать ветку?
- svn Как вы перемещаете файл?
- svn История изменений конкретной строки кода в Subversion
- svn Как переместить файл (или папку) из одной папки в другую в TortoiseSVN?
- svn Would all ally would wouldyy wouldy wouldy would ally would would wouldyyy would wouldy would wouldy would wouldyyyyy would would ally would would wouldyyyyyyyyyy wouldyy would wouldyyy wouldy would would would ally would ally would ally all all all
- svn Частичные коммиты с Subversion
- svn Как перенести репозиторий SVN с историей в новый репозиторий Git?
- svn Как настроить контроль доступа в SVN?
- svn How do I ignore files in Subversion?
- svn Как мне отменить «svn switch» в подкаталоге?
- git Как я могу отменить git reset --hard HEAD ~ 1?
- git Как настроить Git голый доступный по HTTP репозиторий на IIS
- git Как мне отменить неустановленные изменения в Git?
- git Как удалить локальные (неотслеживаемые) файлы из текущего рабочего дерева Git?
- git Как клонировать все удаленные ветки в Git?
- git Как восстановить сброшенный тайник в Git?
- git Как я могу добавить пустой каталог в Git-репозиторий?
- git Как вытащить из Git-репозитория через HTTP-прокси?