2011-02-09 17 views
2

Я написал инструмент развертывания для своих собственных программ на основе SQL и Subversion.Как я могу «svn удалить» папку, а затем добавить папку с тем же именем?

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

До тех пор, пока мой «инструмент развертывания» не работал, но теперь я нашел проблему.

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

Скажем, если я иметь следующую структуру дерева в моей рабочей копии:

- ProgramFiles 
    - Assemblies 
    - Data 
    - Type 1 
     - ... 
    - Type 2 
     - ... 
    - Type 3 
     - ... 

Я хочу, чтобы заменить один каталог (Data). Это вызывает svn delete и после этого Directory.Delete, потому что «svn delete» просто отмечает папки для удаления, когда вы совершаете фиксацию. Теперь я хочу снова добавить папку с именем «Данные» с новыми вложенными папками и файлами, но затем я получаю исключение «Отсутствует область управления рабочей копией». Насколько я могу судить, проблема в том, что каталог .svn в ProgramFiles хранит информацию о том, что папка Data будет удалена, если я прочитаю эту папку, она сработает.
Я также знаю, что я могу зафиксировать перед добавлением папки, но это увеличит мой номер версии с помощью «нестойкой версии».

Как я могу решить эту проблему?

ответ

0

Не удаляйте содержимое папки вместо удаления папки (но не удаляйте папку «.svn»!), А затем просто помещаете туда новые файлы?

+0

У вас такая же проблема, что и в подпапках, если имя одной подпапки равно одной удаленной вложенной папке –

+0

@Robin: ooh, nasty. Не беспокойся в таком случае. –

1

Вы не можете сделать это с помощью одной фиксации, вы должны совершить удаления и надстройку отдельно

+0

Ну, если вы правы и нет другого пути, у меня проблема. Если кто-то хочет удалить папки на самом деле, чтобы добавить их снова (с измененным контентом), а затем решает отменить изменения, там будет разбитая головная ревизия. –

0

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

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

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

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

Это только обходное решение, но единственное, что приходит мне в голову.

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

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

0

Если вам нужно, чтобы это выполнялось в одной фиксации, тогда это возможно, но сложно!

Вместо простых svn delete, а затем Directory.Delete(...) вы должны написать функцию, которая рекурсивно проверяет файлы и папки действующего и желаемого.

псевдокод:

function OverwriteFolder(old, new){ 
    foreach (file system) object in old or new{ 
     if object is in old and new{ 
      if object is file{ 
       overwrite file //no svn command needed 
      } 
      if object is folder{ 
       OverwriteFolder(old/object,new/object) 
      } 
     } 
     if file is in old and not new{ 
      svn delete object 
     } 
     if file is in new and not old{ 
      svn add object 
     } 
    } 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^