При программировании программного обеспечения, хранящегося в репозитории Subversion, я часто изменяю некоторые файлы, а затем замечаю, что хотел бы внести некоторые подготовительные изменения в свою основную работу. Например, при реализации новой функциональности я замечаю некоторый рефакторинг, который может мне помочь.
Чтобы не смешивать два несвязанных изменения, в этих случаях я хотел бы «убрать» мои изменения, то есть вернуться к версии репозитория, сделать некоторые другие изменения, зафиксировать их, а затем «извлечь» мои изменения.
git-stash позволяет делать именно это. Есть ли способ сделать это с помощью Subversion, напрямую или с помощью какого-либо плагина или скрипта. Плагины Eclipse тоже подойдут.
svn
versioning
sleske
источник
источник
Ответы:
Когда я получил незафиксированные изменения от одной задачи в моей рабочей копии, и мне нужно переключиться на другую задачу, я делаю одну из двух вещей:
Проверьте новую рабочую копию для второго задания.
или
Начать ветку:
У меня есть несколько сценариев, которые помогают автоматизировать это.
источник
project\temp\<creationdate-reason>
илиproject\personal\<creationdate-reason>
для этой цели.Этот блог советует использовать diff и patch.
git stash
примерно становитсяsvn diff > patch_name.patch; svn revert -R .
git stash apply
становитсяpatch -p0 < patch_name.patch
Обратите внимание, что это не хранит изменения метаданных или (я думаю) каталог создает / удаляет. (Да, SVN отслеживает их отдельно от содержимого каталога, в отличие от git.)
источник
svn patch patch_name.patch
ихpatch -p0
, потому что они находятся в файле исправления, а svn patch понимает их.Вы можете сохранить ваши текущие изменения
svn diff
в файле патча, а затем вернуть вашу рабочую копию:После того, как вы реализовали свою подготовительную функцию, вы можете применить ваш патч с помощью утилиты:
Как отметили другие, это не будет работать с
svn:properties
древовидными операциями (добавление, удаление, переименование файлов и каталогов).Бинарные файлы также могут создавать проблемы, я не знаю, как исправление (или TortoiseSVN в этом случае их обрабатывает).
источник
$ patch --strip=0 < stash.patch
это гарантирует, что патч не спросит у вас имя файла при применении вашего патча.Самый простой способ - использовать временную ветку, например:
Это может (и, вероятно, должно) быть помещено в сценарий, если это делается на более регулярной основе.
источник
Начиная с 1.10.0 (2018-04-13) у вас есть экспериментальная
svn shelve
команда . ( TortoiseSVN поддерживает команду ). Это не что иное, как помощник для сохранения патча и применения обратно, поэтому он имеет те же ограничения, что иsvn diff
+patch
(т.е. не может обрабатывать двоичные файлы и переименовывать). ( Edit : похоже, что бинарная поддержка будет в следующей версии 1.11.0 )Редактировать ^ 2: С 1.11.0 (выпущен 2018-10-30), двоичные файлы поддерживаются . Переставленные переименованные файлы остались без поддержки. Стеллажи в 1.11 несовместимы с полками, созданными в 1.10.
Редактировать ^ 3: С 1.12.0 (выпущен 2019-04-24), копирование и переименование поддерживаются . Стеллажи в версии 1.12 несовместимы с полками, созданными в предыдущих версиях.
Редактировать ^ 4: Нет никаких изменений вокруг стеллажей с 1.13.0 и 1.14.0 . Команды все еще помечены как экспериментальные, и вам нужно определить,
SVN_EXPERIMENTAL_COMMANDS=shelf3
чтобы включить эту функцию. Похоже, что функция в настоящее время не используется .Замечания по дизайну можно найти в вики разработчиков .
источник
Я не знаю простого способа сделать это с помощью SVN. Честно говоря, я бы посоветовал использовать
git-svn
для создания git-репо, который действует как svn-рабочую копию, и просто использоватьgit stash
с этим. Просто заменитеgit pull
наgit svn rebase
иgit push
с,git svn dcommit
и вы на самом деле можете сохранить 90% вашего рабочего процесса git и по-прежнему общаться с сервером SVN.источник
Существует небольшой скрипт на Python 2, который называется
svn-stash
GPL 3: https://github.com/frankcortes/svn-stash .Это работает как
svn diff/patch
упомянутые решения и предлагает отправлять и извлекать изменения в виде различий в некоторый локальный каталог. К сожалению, тайники не могут быть названы, и может быть извлечен только последний (ну, да, это стек, но нет реальной причины для такого ограничения.) Но тогда вы всегда можете встроить отсутствующие функции в источник.Он написан для * ix, но после замены каждого символа "/"
os.sep
прекрасно работает и под Windows.Если вы используете svn 1.7 или выше, вам нужно изменить
is_a_current_stash()
: убрать строкуif ".svn" in os.listdir(CURRENT_DIR):
, так как в 1.7 WC есть только один subdir верхнего уровня .svn.источник
Вы можете сделать это легко, используя Intellij IDEA - Shelve Changes
источник
metadata changes
иdirectory creates/deletes
? Как именно то, чтоgit stash
делает?Другой вариант - скопировать текущую проверку в новый каталог и отменить все ваши изменения. таким образом вы избавите себя от необходимости создавать временную ветвь на своем сервере - ведь копирование - это локальная операция, которую не все должны видеть и которую можно делать довольно часто.
После исправления вы можете обновить основную рабочую копию и удалить «область хранения».
источник
Я также хотел эту функцию. В настоящее время я использую TortoiseSVN.
Я не нашел надежного решения, кроме как экспортировать дерево, вернуться обратно в репозиторий, внести свои изменения и зафиксировать, а затем сравнить изменения из экспортированного дерева с моим исходным каталогом, используя такой инструмент, как Beyond Compare.
Или другое решение может состоять в том, чтобы перейти от HEAD к другому каталогу, внести изменения и зафиксировать. Когда вы будете готовы объединить их с другой рабочей копией, сделайте обновление и объедините ваши изменения.
источник
Я всегда держу вторую проверку, которую я называю «trunk_clean». Всякий раз, когда мне нужно сделать быстрое изолированное изменение, связанное с тем, что я делаю, я просто обязуюсь вместо этого оформить заказ.
источник
Идеи ветвления и исправления выше замечательны, но они не работают для меня. Я использую инструмент визуального сравнения, поэтому при запуске
git diff
не создаются текстовые патчи. Наша система сборки раскручивает новую среду каждый раз, когда создается ветка, поэтому создание временных веток «stash» может стать грязным.Вместо этого я написал небольшой сценарий оболочки, который копирует файл в каталог «полка», добавляет метку времени и отменяет изменение. Он не такой надежный, как решения, описанные выше, но он также позволяет избежать некоторых подводных камней, с которыми я столкнулся.
источник
Основываясь на ответе Уолтера, я создал следующие псевдонимы в моем файле bashrc:
Эти псевдонимы намного проще в использовании и запоминании.
Использование:
svn.stash для сохранения изменений и svn.stash.apply для применения stash.
источник
В своей практике я использую
git init
для создания Git-репозиторий вtrunk
каталоге моего Subversion-репозитория, а затем добавляю*.git
в шаблоны игнорирования Suctions.После внесения изменений в некоторые файлы, если я хочу продолжить свою работу с основной линией Subversion, я просто использую ее
git stash
для хранения. После фиксации в хранилище Subversion я используюgit stash pop
для восстановления свои модификации.источник
Использование:
Он создаст ветку из текущего местоположения и текущей ревизии, а затем передаст изменения рабочей копии в эту ветку, не переключаясь на нее.
Обратите внимание, что изменения в рабочей копии не будут автоматически отменены (
cp
это просто копирование изменений в новую ветку), и вам придется отменить их вручную.Чтобы восстановить изменения, вы можете просто объединить изменения из вновь созданной ветви в вашу рабочую копию.
--ignore-ancestry
используется для того, чтобы не обновлять информацию о слиянии в рабочей копии.Использование:
чтобы увидеть, что у вас на пути заначки. Принятые изменения также печатаются.
Если вам больше не нужен тайник, просто запустите:
Это решение лучше, чем использование заплатки, потому что, если новые изменения в рабочей копии или в текущей ветке конфликтуют с изменениями в тайнике, вы можете разрешить конфликты с помощью средств svn, тогда как
patch
в некоторых случаях просто не удастся или даже примените патч неправильно.источник
Поскольку Subversion не поддерживает эту
stash
функцию идеально,я просто делаю это вручную.
Поместите
Development
иProduction(release)
спроецируйте на отдельный путь.Вы можете работать с любыми новыми функциями для вашего проекта на пути разработки,
и вы будете только совершать значимый прогресс, или что-то должно быть выпущено для стабильной версии.
Когда вам нужно выпустить его для производства, откройте производственный проект, обновите svn и выполните выпуски (сборка, экспорт ... и т. Д.).
Я знаю, что это немного хлопотно, но выпуск прогресса происходит не часто (это не для меня, но я знаю, что некоторые проекты делают это) по сравнению с развитием прогресса, этот способ подходит мне.
Я использую SVN для конкретных проектов, так как члены команды проекта используют его, поэтому я должен следовать.
Лучшее решение - использовать систему,
git
которая имеет совершенную систему контроля версий и лучшеsvn
.источник
dev
иprod
, 2 ситуации. Разработать совершенно новый функционал было бы сложно с SVN. Я не уверен, есть ли ясный способ решить ваше дело в мире SVN.