Я пишу инструмент, который (среди прочего) автоматизирует процесс добавления файлов в ветку репозитория SVN. Ветка репозитория уже существует, потенциально велика (десятки или сотни ГБ) и содержит множество подкаталогов. Мой инструмент должен будет принять несколько файлов и добавить эти файлы в различные (уже существующие) точки каталога в ветке.
По сути, у меня есть ветка репозитория, расположенная по адресу http://svn.example.com/path/to/repository, которая содержит (под-) деревья каталогов a/..., b/..., c/..., d/... и так далее.
Затем у меня есть файлы, которые я хочу добавить, например:
http://svn.example.com/path/to/repository/a/a_1/file1
http://svn.example.com/path/to/repository/a/b_1/b_1_1/file2
(и так далее).
Эти файлы могут уже существовать в репозитории (в этом случае их нужно будет перезаписать локальной копией) или могут не существовать (в этом случае их нужно будет добавить). Можно предположить, что подкаталоги a/a_1 и b/b_1/b_1_1 уже существуют (и в них есть другие файлы). У меня есть «приличное количество» (обычно от 20 до 50) файлов, которые нужно загрузить за один раз.
Указанная ветвь репозитория не имеет локальной рабочей копии (и нет постоянной причины для существования локальной копии после завершения этой операции).
Из поиска, который я уже сделал в этом процессе, это кажется, как и лучший подход:
svn add файлы; тогдаА именно:
svn checkout https://svn.example.com/path/to/repository /local/path --depth=empty
mkdir -p /local/path/a/a_1 && cp -f file1 /local/path/a/a_1/.
mkdir -p /local/path/b/b_1/b_1_1 && cp -f file2 /local/path/b/b_1/b_1_1/.
...etc...
svn add /local/path/* --depth=infinity
svn update /local/path --accept=mine-full
svn commit /local/path --message = "some message"
... однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке Directory '/local/path/a' is out of date (за которым следует Path already exists, path '/path/to/repository/a').
В какой-то момент, играя с вещами, мне удалось объединить вышеперечисленное с некоторой формой svn resolved, которая изначально работала, пока я не понял, что она удалила все файлы разное в целевом подкаталоге репозитория. Ой!
У кого-нибудь есть хороший способ решить эту проблему? Загрузка всей ветки репозитория (со всеми ее файлами) невозможна; как упоминалось выше, он слишком велик по размеру, чтобы это было работоспособным решением (тем более, что он мне потом не понадобится, поэтому он будет немедленно удален локально).
Судя по поиску, нет хорошего способа проверить только структуру каталогов ветки SVN без связанных файлов. Моя лучшая идея сейчас — просмотреть локальную структуру каталогов и обратиться к каждому файлу по одному, проверяя, добавляя и фиксируя их в репозиторий в отдельной операции. Но это предполагает потенциально много проверок на пакет, что не идеально.
(svn import также не идеален из-за файлов, которые могут уже быть в репозитории и, следовательно, должны быть перезаписаны.)
Любое хорошее решение?





Я думаю, вы ищете svnmucc.
Вы можете поработать над рабочей копией репозитория без. Например, вы можете создать каталог с помощью svnmucc mkdir http://svn.example.com/path/to/repository/newdir, поместить файл с помощью svnmucc put myfile http://svn.example.com/path/to/repository/any_file и т. д. Конечно, вы можете использовать опцию -m для определения сообщения фиксации (без нее вы должны редактировать файл, как в svn commit).
Вы можете прочитать несколько примеров здесь.
Потрясающий. Просто взглянул на документацию, и она выглядит супер-полезной. Спасибо! Попробую, и если это сработает, я приму этот ответ!