Как я могу "svn удалить" папку, а затем добавить папку с тем же именем? - PullRequest
2 голосов
/ 09 февраля 2011

Я написал инструмент развертывания для своих собственных программ на основе SQL и Subversion.

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

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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 09 февраля 2011

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

0 голосов
/ 01 сентября 2011

Если вам нужно, чтобы это было выполнено за один коммит, то это возможно, но сложно!

Вместо простого 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
        }
    }
}

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

0 голосов
/ 09 февраля 2011

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

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

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

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

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

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

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

0 голосов
/ 09 февраля 2011

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

...