Удалить недостающие файлы в SVN при фиксации снимков

Я перехожу из StarTeam в SVN, и я решил сделать снимки каждого из наших релизов. Тем не менее, я столкнулся с проблемой при работе с файлами, которые существовали в ревизии 1 были удалены для ревизии 2.

Как я фиксирую снимки, когда файлы отсутствуют?

Я попытался полностью удалить папку trunk/src/ и затем заменить ее новой папкой /trunk/src/, но это, похоже, вызывает конфликты с отсутствующими файлами. Когда я svn добавляю "все", TortoiseSVN, кажется, обнаруживает, что файлы отсутствуют, и когда я фиксирую, кажется, что он пытается удалить отсутствующие файлы, но, похоже, не удается. Предположительно, это происходит потому, что он пытается удалить каталоги после удаления файлов в этом каталоге?

Я получаю следующую ошибку:

deleting C:\trunk\src\myfile.h  // this one's okay
deleting C:\trunk\src\res
Commit failed (details follow):
Directory 'C:\trunk\src\res' is out of date
Item '/trunk/src/res' is out of date
You have to update your working copy first.

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

Спасибо!

Старый (неясный) пост: Миграция в SVN, запутанная в удалении старых файлов

Редактировать:

Это происходит от одного снимка к другому. Я мигрирую из другого хранилища (StarTeam), поэтому у меня ничего не было в багажнике. Я просто хочу проверить все снимки и удалить удаленные файлы. Разве это не плохая идея пометить, если у меня ничего нет в багажнике?

5 ответов

Решение

На самом деле есть скрипт Subversion, который делает это для вас, который называется svn-merge-repos.pl

Я не уверен на 100%, что вы понимаете, как работает Subversion. Вы прошли книгу Subversion?

В Subversion нет настоящих tags/labels или же branches метаданные, которые вы найдете во многих системах контроля версий. Вместо этого вы помещаете теги и ветви в свои собственные каталоги. Чтобы создать ветку или тег, вы копируете то, что хотите разветвлять или тегить в каталог:

# Creating a branch for 2.0 development from trunk
$ cp http://server/svn/module/trunk http://server/svn/module/branches/2.0

# Tagging my 2.0 development as 2.0.1
$ cp http://server/svn/module/branches/2.0 http://server/svn/module/tags/2.0.1

В теории вы можете просто создать новый branch или же tag каталог для каждого выпуска и ветки, над которой вы работаете, без необходимости объединения репозиториев. Это то, что я сделал, когда сделал преобразование StarTeam в Subversion. Проблема в том, что вы теряете связь между скажем ревизией 2.0.1 и 2.0.2, так как они не имеют общей истории. В 99% случаев это не проблема, и вы всегда можете вернуться к исходному архиву StarTeam, если вам что-то понадобится. Через несколько месяцев никому не будет дела.

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

Например, у вас есть 2.0 ветвь, которая исходит от trunk, 2.0.1 тег, 2.0.2 тег и 2.0.3 тег, вы можете сделать это:

  • Положите ветку 2.0.1 релиз на ствол.
  • Копировать багажник в branches/2.0,
  • Поместите следующую ветку в транк и скопируйте ее в ее ветку (используйте скрипт svn-merge-repos.pl)
  • Наконец, поставьте текущий багажник.
  • Теперь иди к этому branches/2.0 каталог и скопировать его в tags/2.0.1, Используя скрипт svn-merge-repos.pl, создайте 2.0.1 выпуск на branches/2.0 и скопировать это tags/2.0.2, Продолжайте, пока не дойдете до верхушки ветки 2.0.

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

Я, конечно, не эксперт по SVN, но я считаю, что вы должны выпустить svn delete команда для элементов, которые вы хотите удалить при следующей фиксации. Это описано здесь.

Вы должны создать тег вместо.
РЕДАКТИРОВАТЬ:
svn status список всех изменений
Вы можете распечатать все удаленные файлы следующим образом:
SVN статус | grep -E '^!' | awk '{print $2}' > /tmp/changes
Вы можете сделать SVN удалить для каждого файла с пакетом;)

РЕДАКТИРОВАТЬ: (SVN Migration How-To)

Предположим, у вас есть проект с именем projectA и пустой SVN-репозиторий.
Во-первых, вы должны создать структуру папок следующим образом:

Projecta /
|- филиалы
| - теги
| - багажник


Затем импортируйте файлы вашего проекта.

Projecta /
|- филиалы
| - теги
`- багажник
    | - ЧИТАТЬ
    `- SRC

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

Projecta /
|- филиалы
| - теги
|   `- выпуск-1
`- багажник
    | - ЧИТАТЬ
    `- SRC


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

Магистраль всегда должна содержать актуальную версию вашего кода.
Я настоятельно рекомендую вам использовать TortoiseSVN на Windows, если вы новичок;)

Вы должны использовать svn-load-dirs.pl:

"Этот Perl-скрипт предназначен для загрузки нескольких каталогов в Subversion. Это полезно, если у вас есть несколько.zip или tar.{Z,gz,bz2} для определенного пакета и вы хотите загрузить их в Subversion."

В основном то, что вы делаете:

  • экспортировать все теги в хронологическом порядке
  • создать пустой репозиторий
  • используйте svn_load_dirs.pl, чтобы "сложить" тег после тега в вашей подрывной деятельности.

svn_load_dirs.pl создает одну ревизию для каждого тега, и вы можете также создать тег (subversion-) после каждого импорта. Он будет отслеживать все удаленные и добавленные файлы и будет выполнять соответствующие действия SVN. Это означает, что вы можете явно начать с пустого ствола

Судя по вашему вопросу, похоже, что вы заканчиваете злоупотребление SVN. Нет смысла удалять всю папку trunk/src и заменять ее новой, за исключением случаев значительных изменений в коде.

Вместо этого создайте тег для выпуска.

Другие вопросы по тегам