Сам по себе Subversion не имеет понятия «транзакции».Команды Subversion, которые изменяют удаленный репозиторий, являются атомарными, и многие, которые изменяют рабочую копию, легко обратимы, поэтому обычно нет необходимости в «транзакции» в обычном смысле.Если вашему приложению требуются транзакции, вы должны иметь возможность собрать собственную платформу для поддержки этого (я не знаю ни одного заранее созданного решения).
Вероятно, проблема, с которой вы столкнетесь, будет прервана.сделкаЕсли команда «подготовить» транзакции фиксирует входящее изменение, нет простого способа «отменить» уже выполненную фиксацию.Вы можете выпустить второй коммит, который просто отменяет исходное изменение (например, обратное слияние), но при этом в хранилище будут добавлены две новые ревизии (HEAD выглядит одинаково до и после неудачной транзакции, ноон не является действительно неизменным, поскольку теперь существует промежуточная версия).Вы можете использовать команды svnadmin
, чтобы выгрузить репозиторий и отфильтровать ревизию, которую вы хотите откатить, но это рискованно и может легко привести к проблемам.Subversion разработан таким образом, что он не теряет историю, поэтому удаление чего-либо из истории хранилища обязательно затруднительно (другие системы контроля версий, такие как git
, делают это намного проще).
Один из способов обойти это можетиспользовать репозиторий git в качестве промежуточной области для входящих коммитов.Когда команда «подготовить» транзакции отправляется, входящее изменение фиксируется в git-репо.Если команда «abort» отправлена, фиксация удаляется из репозитория git через git reset
.Команда commit указывает git (через git-svn
) отправить коммит в репозиторий Subversion.Таким образом, хранилище Subversion не изменяется, если транзакция не зафиксирована, но на сервере по-прежнему хранятся данные, которые кэшируются таким образом, с которым легко работать.