Svn как удалить файл

Обновлено: 02.07.2024

Команда svn delete (svn rm), насколько я понял по руководству по SVN, подготавливает файл к удалению, а затем при up-е обязательно удаляет так же файл из рабочей копии.

Можно ли сделать так, чтобы SVN просто начал игнорировать конкретные файлы? (удалил их из репозитория, но не затрагивал их при этом в рабочих копиях)

Удалить файл из репозитория, но оставить в файловой системе: svn rm filename --keep-local

  1. Сделать файл list с именами или масками, разделённые переводом строки
  2. Выполнить svn propset 'svn:ignore' -F list .
  3. list можно удалить.

Анатолий, откуда вы узнали про --keep-local?! В мануале я нигде такой опции не нашёл.

В результате эксперимента с опцией --keep-local выяснилось, что она всё-таки сохраняет файл в текущей рабочей копии, но всё равно удалит его в других при выполнении svn up. То есть это не всё равно не то.

Откуда узнал: svn help rm

Из других удаляет? Хмм, тогда мне самому теперь интересно, как бы осуществить такое удаление, и возможно ли вообще.

Забавно про svn help . ) Значит, об --keep-local ещё не успели написать в мануал.

Вот именно, что опция сейчас получается неполноценной. А так ей бы цены не было!

Нет, речь совсем не об этом. Нужно именно удалить файл (файлы) из-под версионного контроля, а не просто начать игнорировать его в конкретной рабочей копии.

svn propedit svn:ignore log

открывается редактор и мы можем задавать маски игнорирования
* - игнорит все
*.log - игнорит по маске только .log

все установки игнорирования действуют только на новые файлы… даже если файлы небыли добавлены в SVN но существовали SVN будет на них ругаться что они не под контролем, их надо переместить сделать коммит и вернуть

«даже если файлы небыли добавлены в SVN» — были, были добавлены. Можете считать, что по ошибке. Речь не об игнорировании, речь о всего лишь удалении из-под версионного контроля.

anatoly_rr предложил замечательную опцию --keep-local, но она работает только один раз. При обновлении других рабочих копий эта опция уже игнорируется (т. к. видимо SVN не предусматривает того, что файл можно удалить из репозитория, но оставить его в рабочих копиях). Неужели такого нет?


По просьбам трудящихся, а так же учитывая, что есть статья по установке SVN (правда +Trac) под Linux, решил написать краткое описание установки и настройки SVN для Windows.
Ничего нового для людей, хорошо знающих и работающих с SVN, здесь не будет. Цель статьи — помочь некоторому проценту новичков, пребывающих на Хабре, таки осилить изучение этой системы контроля версий.

С самого начала сообщаю, что для SVN есть подробное руководство. Называется оно svn-book и доступно на сайте и идет вместе с CollabNet Subversion-server. Так же про установку и настройку svnserv с Apache есть описание в учебнике по TortioseSVN (довольно хорошая подробная помощь на русском).

На самом деле SVN-клиент может отлично работать и без сервера. Репозиторий (хранилище кода) можно создать в любом каталоге на собственном HDD, или в сетевом каталоге. Сервер требуется лишь для удаленного доступа к репозиторию, не больше. Локальный репозиторий годится, если над проектом работает один человек и ему просто нужна система контроля версий своего приложения и бэкапы.

Установка сервера

5 MB). Первый идет в комплекте с Apache, второй — с Apache и плагином для Windows Management Console. Так же для VisualSVN есть платная возможность интеграции с Visual Studio.

A. Установка и настройка сервера VisualSVN (svn-сервер + Apache + консоль управления) самая простая. Эту версию нельзя установить без Apache.

Работа с сервером VisualSVNбезусловно самая простая.

B. Установка CollabNet Subversion Server (svn-сервер + Apache опционально).

После установки появятся две новых службы Windows: Subversion Server (наш svnserv.exe) и Apache2.2 (если он был включен при установке). Чтобы все заработало их нужно запустить.

С. Установка svnserve 1.4.6 (чистый svn-сервер).

1) Скачиваем файл svn-1.4.6-setup.exe. Запускаем его на установку. При установке ничего кроме целевого каталога указывать не надо. После установки этот каталог надо добавить в переменную среды PATH (не помню, возможно это делается автоматически).
2) Создаем репозитории командой: svnadmin create c:\repositories\example-repository
3) Создаем сервис. Команда в консоли: sc create svn_svr binpath= «c:\Program Files\Subversion\bin\svnserve.exe --service -r C:\repositories\» displayname= «Subversion Svr»
Здесь -r C:\repositories — адрес каталога с репозиториями, т.е. от него потом будут вычисляться пути. Например, если есть 2 репозитория: C:\repositories\proj1 и C:\repositories\proj2, то указав параметром -r C:\repositories потом пути к репозиториям будут: svn://localhost:3690/proj1 и svn://localhost:3690/proj2 соответственно. Порт 3690 устанавливается по умолчанию, но его можно поменять (подробности в svn book).4) Запускается сервис автоматически при старте Windows или из списка служб.

Именно эту работу (если не считать установку Apache) сделал за вас установщик CollabNet Subversion Server. В случае установки svnserve 1.4.6 доступ к репозиторию будет только по протоколу svn://.

D. Создание репозитория. Выделяю этот пункт отдельным разделом. Если в VisualSVN создание репозитория производится кликом мыши, то для svnserve (в том числе в версии от CollabNet) репозиторий создается из консоли. В поставке snv-сервера есть файл snv-install-folder\bin\svnadmin.exe. Если путь к snv-install-folder\bin еще не прописан в PATH, сделайте это.

Чтобы создать репозиторий, откройте консоль (cmd) и перейдите в каталог для хранения репозиториев, который вы указывали при установке (CollabNet) или создании сервиса (svnserve 1.4.6). Создайте новый пустой подкаталог (например, example-repository). В консоли выполните команду: svnadmin create example-repository. В только что созданном каталоге появится структура файлов svn. В них есть много полезных «штук», о которых можно почитать в svn-book и учебнике.

Для начала такое определение доступа годится, но в последствии конечно пароли надо шифровать (читаем svn-book).

На этом установка сервера закончена и можно установить клиент.

Установка клиента.

Некоторые профессионалы предпочитают работать с консолью. Наверное это не самый удобный способ, особенно для новичков, поэтому рассматривать его не будем. Другие работают с SVN через плагины к своим IDE. Это самый лучший способ, но поскольку разных IDE много и плагинов к ним тоже, в этой статье работу с ними не описываем.

Самым популярным и признанным клиентом SVN под Windows является TortoiseSVN. После его установки вы не получите отдельной программы, которую можно «классически запустить», клиент встраивается в проводник Windows, а команды для него доступны из контекстного меню файла (в т.ч. и в Total Commander).

Описывать установку клиента нет никакого смысла, там все элементарно просто.

О том, как работать с TortoiseSVN, подробно расписано в руководстве TortoiseSVN Клиент Subversion для Windows.

Дублировать это подробное руководство, конечно, желания нет, но все же super-fast-start work with tsvn опишу.

1) Для просмотра любого репозитория после установки TortoiseSVN вызовите контекствное меню на любом файле в системе, выберите меню TortoiseSVN→Repo-browser. В открывшемся окошке введите адрес репозитория с протоколом (например, localhost:8443/svn/test или svn://someserver:3690/proj1/trunc). Откроется окно просмотра репозитория (с помощью кнопки напротив строки адреса можно выбрать, какую ревизию просмотреть; HEAD — это последняя ревизия).

2) Для создания локального репозитория (не используя сервер) запускается пункт меню TortoiseSVN→Create repository here. на нужном каталоге. В Repo-browser такой репозиторий доступен по протоколу file:///.

3) Для скачки себе версии из существующего репозитория запускается пункт меню TortoiseSVN→SVN Checkout на каталоге, в который сольется версия.

4) Если вы еще не использовали SVN и хотите залить на сервер свою текущую версию исходников, запустите пункт меню TortoiseSVN→Import. на каталоге, в котором лежит версия (при этом не забудьте, что разрабатываемую ветку надо лить в trunk).

5) TortoiseSVN→Export. используется для получения чистой версии исходников из репозитория (без служебных файлов контроля версий).

6) Если контекстное меню вызвать на каталоге, который является локальной (рабочей) копией репозитория, контекстное меню значительно расшириться. Например, появятся пункты Update (слить последние изменения с сервера) и Commit (закачать ваши изменения на сервер).

На последок рекомендую почитать интересную серию статей Работа с Tortoise SVN.

Subversion позволяет переименовывать и перемещать файлы и папки. Так есть пункты меню для удаления и переименования в подменю TortoiseSVN.

Рисунок 4.34. Контекстное меню Проводника для версированных файлов

Контекстное меню Проводника для версированных файлов

Удаление файлов и папок

Для удаления файлов и папок из Subversion применяется команда TortoiseSVN → Удалить .

Когда вы решаете TortoiseSVN → Удалить файл или папку, они сразу же удаляются из вашей рабочей копии и помечаются для удаления в хранилище при следующей фиксации. Родительская папка этого элемента отображается с пометкой « изменённый » . До тех пор, пока не произведена фиксация, вы можете вернуть файл обратно, если вызовете TortoiseSVN → Убрать изменения на родительской папке.

Если вы желаете удалить какой-нибудь объект из хранилища, но в то же время оставить его локально как неверсированный файл/папку, воспользуйтесь Расширенное контекстное меню → Удалить (оставив локально) . Вам необходимо удерживать клавишу Shift при правом щелчке на объекте в панели со списком файлов Проводника (правая панель) для того, чтобы увидеть этот пункт в расширенном контекстном меню.

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

Возвращение назад удалённого файла или папки

Если вы удалили файл или папку и уже зафиксировали эту операцию удаления в хранилище, то обычное TortoiseSVN → Убрать изменения не вернет это назад. Но файл или папка не потеряны навсегда. Если вы знаете ревизию в которой был удален файл или папка (если не знаете — найдите в журнале), то откройте обозреватель хранилища и переключитесь на эту ревизию. Затем выберите удаленный файл или папку, нажмите правую кнопку мыши и выберите Context Menu → Копировать в.

Перемещение файлов и папок

Если вы желаете просто переименовать (без перемещения) файл или папку , используйте Контекстное меню → Переименовать. Введите новое имя переименуемого объекта и это всё.

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

выберите файлы или папки, которые вы желаете переместить

затем перетащите правой кнопкой мыши их на новое место внутри рабочей копии

отпустите правую кнопку мыши

в появившемся меню выберите Контекстное меню → SVN Переместить версированные файлы сюда

Фиксируйте родительскую папку

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

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

Другим способом перемещения или копирования файлов является использования команд Windows копировать/вырезать. Выберите файлы, которые вы хотите скопировать, сделайте правый клик и выберите Context Menu → Копировать в контекстном меню проводника. Затем перейдите в целевую папку, сделайте правый клик и выберите TortoiseSVN → Вставить . Для перемещения файлов выберите Context Menu → Вырезать вместо Context Menu → Копировать .

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

Не перемещайте внешнее при помощи SVN

Не надо применять команды TortoiseSVN Переместить или Переименовать к папкам, созданным с использованием svn:externals . Это действие приводит к удалению внешних элементов из их родительского хранилища, вероятно вызывая замешательство у множества других людей. Если вам необходимо переместить папку с внешним, то надо использовать обычное перемещение в оболочке (например, Проводнике), а затем настроить свойство svn:externals исходной и целевой родительских папок.

В случае, когда у вас в хранилище есть два файла с одинаковыми именами, различающиеся только регистром (например, TEST.TXT и test.txt ), вы больше не сможете обновить или извлечь папку, содержащую эти файлы, при помощи клиента под Windows. Хотя Subversion и поддерживает имена файлов, различающиеся регистром, их не поддерживает Windows.

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

В этом случае вам необходимо решить, какой из них вы желаете сохранить и удалить (или переименовать) другой из хранилища.

Предотвращение двух одинаковых имён у файлов

Исправление переименования файлов

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

Удаление неверсированных файлов

Обычно ваш список игнорирования настроен так, чтобы Subversion игнорировала все генерируемые файлы. Но что, если вы желаете очистить все эти игнорируемые элементы для порождения чистой сборки? Как правило, вы настраиваете это в вашем сборочном файле, но если вы отлаживаете сборочный файл, или изменяете систему сборки, полезно иметь способ очистки места действия.

TortoiseSVN предоставляет именно такую возможность, применяя Расширенное контекстное меню → Удалить неверсированные элементы. . Вам необходимо удерживать клавишу Shift при правом щелчке на папке в панели со списком Проводника (правой панели) для того, чтобы увидеть этот пункт в расширенном контекстном меню. Это выводит диалог, в котором будут перечислены все неверсированные файлы со всей вашей рабочей копии, и вы сможете отметить или разотметить элементы для удаления.

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

Если команда Subversion не может быть завершена, например, из-за проблем сервера, то ваша рабочая копия может остаться в несогласованном состоянии. В этом случае вам необходимо выполнить команду для папки: TortoiseSVN → Очистка Рекомендуется выполнять эту команду для папки верхнего уровня вашей рабочей копии.

Рисунок 4.36. Диалог Очистки

Диалог Очистки

В диалоге очистки также есть другие полезные варианты для приведения рабочей копии в чистое состояние.

Как говорилось выше, этот вариант пытается привести рабочую копию из несогласованного в рабочее состояние. Это не затрагивает ваши данные, а только внутреннее состояние базы данных рабочей копии. Фактически это команда Очистить , которая знакома вам по предыдущим версиям TortoiseSVN или другим клиентам SVN.

Снять блокировки на запись

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

Отключайте эту опцию только в том случае, если рабочая копия используется одновременно другими пользователями/клиентами. Но, если очистка перестанет работать, вам придется включить эту опцию, чтобы очиста заработала.

Adjusts the recorded time stamps of all files, speeding up future status checks. This can speed up all dialogs that show working copy file lists, for example the Commit dialog.

Вакуумные нетронутые копии

Удаляет неиспользуемые первоначальные копии и сжимает все оставшиеся первоначальные копии файлов рабочей копии.

Обновить оверлеи оболочки

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

Если отмечено, то все действия выполняются для всех файлов и папок включая те, которые со свойством svn:externals .

Удалить неверсированные файлы и папки, Удалить игнорируемые файлы и папки

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

Примечание: вы можете сделать тоже самое из диалога TortoiseSVN → Убрать изменения . Там вы также получаете список всех неверсированных файлов и папок, чтобы выбрать их для удаления.

Отменить все изменения рекурсивно

Эта команда отменяет все ваши локальные изменения, которые ещё не зафиксированы.

Примечание: лучше использовать команду TortoiseSVN → Убрать изменения , потому что вы сначала можете посмотреть и выбрать файлы, в которых хотите убрать изменения.

Рисунок 4.33. Контекстное меню Проводника для неверсированных файлов

Контекстное меню Проводника для неверсированных файлов


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

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

Если вы щёлкнете правой клавишей мыши на одиночном неверсированном файле, и выберите из контекстного меню команду TortoiseSVN → Добавить в список игнорирования , появится подменю, позволяющее вам выбрать, добавить ли в список только этот файл, или же добавить все файлы с таким же расширением. Оба подменю также имеют эквиваленты (рекурсивно) . Если вы выберете несколько файлов, подменю не появится, и вы сможете добавить только эти конкретные файлы/папки.

Если вы выберете в контекстном меню игнорирования вариант (рекурсивно) , то элемент будет проигнорирован не только в выбранной папке, но также и во всех подпапках. Для этого требуется клиент SVN версии 1.8 или выше.

Если вы желаете удалить один или несколько элементов из списка игнорирования, выполните правый щелчок на этих элементах и выберите TortoiseSVN → Удалить из списка игнорирования Вы также можете обратиться к свойству папки svn:ignore напрямую. Это позволит вам указать более общие шаблоны, используя универсализацию имён файлов, описываемую далее. Более подробную информацию об установке свойств содержит «Установки проекта». Обратите внимание: каждый шаблон игнорирования должен быть в отдельной строке, разделение их пробелами не работает.

Глобальный список игнорирования

Другой путь игнорирования файлов - добавить их в глобальный список игнорирования. В этом случае самое большое отличие в том, что глобальный список игнорирования - это клиентское свойство. Оно применяется ко всем проектам Subversion, но только на этом клиентском компьютере. В общем случае, лучше использовать свойство svn:ignore когда возможно, так как оно может быть применено к конкретным разделам проекта, и оно работает для всех извлекающих этот проект. Более подробную информацию смотрите в «Общие настройки».

Игнорирование версированных файлов и папок

Версированные файлы и папки не могут игнорироваться - так устроена Subversion. Если вы версировали файл по ошибке, прочтите «Игнорировать файлы, которые уже версированы», где приведены инструкции, как сделать его « неверсированным » .

Сопоставление шаблону в списках игнорирования

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

Соответствует любой строке, включая пустую строку (без символов).

Соответствует любому одиночному символу.

Соответствует любому символу, заключённому в квадратные скобки. Внутри скобок пара символов, разделённая « - » соответствует любому символу, лексически расположенному между ними. Например, [AGm-p] соответствует любому из A , G , m , n , o или p .

Соответствие шаблону регистрозависимое, что может привести к проблемам на Windows. Вы можете включить независимость от регистра явным образом удваивая символы, т. е. вместо регистронезависимого шаблона *.tmp использовать *.[Tt][Mm][Pp] .

Если вам необходимо официальное описание универсализации, вы можете найти его в спецификации IEEE для командного языка оболочки Pattern Matching Notation.

Никаких путей в глобальном списке игнорирования

Не надо включать полный путь в задаваемый шаблон. Сопоставление с шаблоном предназначено для использования с обыкновенными именами файлов и папок. Если вы желаете игнорировать все папки CVS , просто добавьте CVS в список игнорирования. Нет необходимости указывать CVS */CVS , как в более ранних версиях. Если же вы желаете игнорировать все папки tmp , которые находятся в каталоге prog , но не в doc , вам необходимо воспользоваться свойством svn:ignore . Не существует надёжного способа добиться этого при помощи глобальных шаблонов игнорирования.

Читайте также: