SVN: Вы можете удалить каталоги только из локальной проверки (не из хранилища)? - PullRequest
47 голосов
/ 17 сентября 2009

Предположим, что у вас есть каталог под управлением subversion, который содержит несколько файлов и множество подкаталогов, например:

file1.txt
file2.txt
file3.txt
dir1/
dir2/
dir3/
dir4/
:
dirXX/

Теперь вам нужны файлы и некоторые из папок, но не все. Это можно сделать с помощью SVN. Просто сделайте проверку не рекурсивной:

svn checkout -N <URL>

Это проверяет только первый каталог и файлы внутри. Подкаталоги не включены. Даже если вы войдете в каталог извлечения и запустите «svn up», он будет обновлять только проверенные ранее файлы, но не будет добавлять каталоги. Теперь вы можете выборочно добавлять нужные каталоги, явно обновляя их. Например. если вам нужны только dir2 и dir4, вы можете зайти в каталог checkout и выполнить

svn up dir2
svn up dir4

Если в будущем вы запустите универсальный «svn up», он обновит только файлы и эти два каталога, но не добавит другие каталоги.

Теперь проблема: что если я решу в какой-то более поздний момент, что мне больше не нужен dir2? Как мне от этого избавиться? Кажется, нет никакого способа сделать это, кроме удаления всей проверки и начала с нуля.

Когда вы просто удаляете dir2, следующий «svn up» вернет его обратно, так как «svn status», конечно, покажет его как отсутствующий («!» Перед его именем). Запуск «svn remove», конечно, удалит его, но при следующем коммите он также удалит его из хранилища, что не должно происходить.

Даже новая функция разреженного каталога («мелкая проверка») в SVN 1.5 здесь бесполезна:

Реализация Subversion 1.5 мелкие кассы это хорошо, но не поддержать пару интересных поведения. Во-первых, вы не можете снимите телескоп с рабочей копии. Запуск обновления SVN --set-глубина пусто в бесконечной рабочей копии не имеют эффекта отбрасывания все, кроме самого верхнего каталог - он просто выдаст ошибку.
- http://svnbook.red -bean.com / ru / 1.5 / svn.advanced.sparsedirs.html

Это невозможно с SVN? Кто-нибудь когда-нибудь придумал умное решение этой проблемы?

Простое создание каталога извлечения (без SVN), а затем извлечение отдельных подкаталогов из репозитория непосредственно в качестве подкаталогов в этом каталоге будет работать для каталогов: теперь каждый каталог является отдельной проверкой, может обновляться и один раз не обновляться. нужно больше, вы можете просто удалить его. Тем не менее, как мне получить файлы (например, file1.txt)? SVN не позволяет извлекать отдельные файлы, вы можете извлекать только целые каталоги.

Ответы [ 5 ]

57 голосов
/ 17 сентября 2009

То, что я пытаюсь сделать, нельзя сделать с помощью Subversion 1.4 или Subversion 1.5; Период.
Никакого обходного пути не существует, так оно и есть.

Это может быть сделано с Subversion 1.6.

В отличие от SVN 1.5, SVN 1.6 может уменьшить глубину в каталоге

svn up --set-depth exclude dir2

это решение. Он устанавливает глубину для dir2 равной нулю, и он немедленно исчезнет из проверки, и никакое обновление не вернет его, если вы явно не установите значение глубины этого каталога снова (или просто не обновите его без параметра глубины, так как не указывать глубину всегда означает бесконечность, если только вы не используете нерекурсивный, что означает «файлы»).

Совет:
На самом деле SVN 1.6 не может реально уменьшить глубину так же, как может увеличить ее. Вы можете увеличить его с любого уровня на любой более высокий уровень. Вы можете только уменьшить его, чтобы «исключить» (самый низкий уровень из всех). Если вы хотите уменьшить значение «бесконечность» (наивысшее) до «файлы» (где-то посередине), вы должны сначала уменьшить его до «исключить» (вызывая исчезновение каталога), а затем снова увеличить его до «файлы». Это что-то вроде хака, но работает просто замечательно.

37 голосов
/ 05 апреля 2012

Для тех, кто сталкивается с этим позже и использует TortoiseSVN , вот как сделать то же самое ...

  1. Щелкните правой кнопкой мыши папку, которую вы больше не хотите извлекать (это папка, которую вы хотите исключить)
  2. В контекстном меню выберите «TortoiseSVN> Обновить до версии ...»
  3. В появившемся окне установите для раскрывающегося окна «Глубина обновления» значение «Исключить»
  4. Нажмите «ОК». SVN автоматически удалит этот каталог с вашего диска.

(Примечание. Это было сделано с TortoiseSVN 1.7.5 и может отличаться для других версий.)

10 голосов
/ 02 августа 2010

Обновление: я использую SVN 1.6.11, и мне удалось удалить телескоп, используя svn up --set-depth empty dir, а не exclude каталог.

2 голосов
/ 04 августа 2010

С svn 1.6, --set-depth - это ответ.

С svn <1.6 вы можете получить редкие извлечения, злоупотребив <code>svn switch: создайте пустой каталог где-нибудь в вашем хранилище, и switch подкаталоги, в которых вы сейчас не нуждаетесь, чтобы указать на них вместо их «настоящих "URL.

1 голос
/ 17 сентября 2009

Вы можете попробовать этот трюк с участием локального репозитория и svn: externals объявлений.

Хотя сам не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...