Как добавить (несколько) файлов в (разные) каталоги в существующем репозитории SVN (у которого нет локальной рабочей копии)?

Я пишу инструмент, который (среди прочего) автоматизирует процесс добавления файлов в ветку репозитория 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 файлы; тогда
  • совершить весь комплект и kaboodle.

А именно:

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 также не идеален из-за файлов, которые могут уже быть в репозитории и, следовательно, должны быть перезаписаны.)

Любое хорошее решение?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
283
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы ищете 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).

Вы можете прочитать несколько примеров здесь.

Потрясающий. Просто взглянул на документацию, и она выглядит супер-полезной. Спасибо! Попробую, и если это сработает, я приму этот ответ!

mrputter 30.03.2019 07:39

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