Временно отложите незафиксированные изменения в Subversion (а-ля "git-stash") - PullRequest
299 голосов
/ 12 октября 2009

При программировании программного обеспечения, хранящегося в репозитории Subversion, я часто изменяю некоторые файлы, а затем замечаю, что хотел бы внести некоторые подготовительные изменения в основную работу. Например. при реализации новых функций я замечаю некоторый рефакторинг, который может мне помочь.

Чтобы не смешивать два несвязанных изменения, в этих случаях я хотел бы «убрать» мои изменения, то есть вернуться к версии репозитория, сделать некоторые другие изменения, зафиксировать их, а затем «извлечь» мои изменения.

git-stash позволяет это сделать. Есть ли способ сделать это с помощью Subversion, напрямую или с помощью какого-либо плагина или скрипта. Плагины Eclipse тоже подойдут.

Ответы [ 16 ]

1 голос
/ 12 октября 2009

Я также хотел эту функцию. В настоящее время я использую TortoiseSVN.

Я не нашел надежного решения, кроме как экспортировать дерево, вернуться в репозиторий, внести свои изменения и зафиксировать, а затем сравнить изменения из экспортированного дерева с моим исходным каталогом, используя такой инструмент, как Beyond Compare.

Или, другим решением может быть переход от HEAD к другому каталогу, внесение изменений и фиксация. Когда вы будете готовы объединить их с другой рабочей копией, сделайте обновление и объедините ваши изменения.

0 голосов
/ 19 марта 2019

Поскольку Subversion не поддерживает функцию stash,
Я просто делаю это вручную.

Поместите Development и Production(release) проект в отдельный путь.

source\code\MyApp         -- Development
release\MyApp(release)    -- Production(release)

Вы можете использовать любые новые функции для своего проекта в процессе разработки,
и вы только совершите значительный прогресс или что-то должно быть выпущено для стабильной.

Когда вам нужно выпустить его для производства, откройте производственный проект, обновите svn и сделайте вещи для выпуска (сборка, экспорт и т. Д.).

Я знаю, что это немного хлопотно, но выпуск прогресса происходит не часто (это не для меня, но я знаю, что некоторые проекты делают это) по сравнению с развитием прогресса, этот способ мне подходит.

Я использую SVN для конкретных проектов, так как члены команды проекта используют его, поэтому я должен следовать.
Лучшее решение - использовать git, который имеет совершенную систему контроля версий и лучше, чем svn.

0 голосов
/ 13 июня 2018

Использование:

svn cp --parents . ^/trash-stash/my-stash

Он создаст ветку из текущего местоположения и текущей ревизии, а затем зафиксирует изменения в рабочей копии в этой ветке, не переключаясь на нее.

использование: копировать SRC [@REV] ... DST

SRC и DST могут быть либо путем к рабочей копии (WC), либо URL:

WC  -> URL:  immediately commit a copy of WC to URL

Обратите внимание, что изменения в рабочей копии не будут автоматически отменены (cp это просто CoPying изменения в новую ветвь), и вам придется отменить их вручную.

Чтобы восстановить изменения, вы можете просто объединить изменения из вновь созданной ветви в вашу рабочую копию.

svn merge --ignore-ancestry ^/trash-stash/my-stash -c <commited revision>

--ignore-ancestry используется для того, чтобы не обновлять информацию о слиянии в рабочей копии.

Использование:

svn ls -v ^/trash-stash/

чтобы увидеть, что у вас на пути к тайнику. Принятые изменения также печатаются.

Если вам больше не нужен тайник, просто запустите:

svn rm ^/trash-stash/my-stash

Это решение лучше, чем использование патча, в том случае, если новые изменения в рабочей копии или в текущей ветке конфликтуют с изменениями в тайнике, вы можете разрешить конфликты средствами svn, тогда как patch в некоторых случаях просто не удастся или даже применить патч неправильно.

0 голосов
/ 12 марта 2018

Основываясь на ответе Уолтера, я создал следующие псевдонимы в моем файле bashrc:

alias svn.stash='read -p "saving local changes in raq.patch. Existing stash in raq.patch will be overwritten. Continue?[y/N]" && [[ $REPLY =~ ^[yY] ]] && rm -f raq.patch && svn diff > raq.patch && svn revert -R .'
alias svn.stash.apply='patch -p0 < raq.patch; rm -f raq.patch'

Эти псевдонимы намного проще в использовании и запоминании.

Использование:

svn.stash для сохранения изменений и svn.stash.apply для применения хранения.

0 голосов
/ 06 августа 2017

В своей практике я использую git init для создания Git-репозитория в trunk каталоге моего Subversion-репозитория, а затем добавляю *.git в шаблоны игнорирования Suctions.

После изменения некоторых файлов, если я хочу продолжить свою работу с основной линией Subversion, я просто использую git stash, чтобы спрятать свою работу. После фиксации в хранилище Subversion я использую git stash pop для восстановления моих модификаций.

0 голосов
/ 15 сентября 2015

Идеи ветвления и исправления выше замечательны, но они не работают для меня. Я использую инструмент визуального сравнения, поэтому запуск git diff не производит текстовые патчи. Наша система сборки раскручивает новую среду каждый раз, когда создается ветка, поэтому создание временных веток «stash» может стать грязным.

Вместо этого я написал небольшой сценарий оболочки , который копирует файл в каталог "полка", добавляет временную метку и отменяет изменение. Он не такой надежный, как приведенные выше решения, но он также позволяет избежать некоторых подводных камней, с которыми я столкнулся.

...