Назад | Перейти на главную страницу

удаление одного файла из старой ревизии Subversion из репозитория

У нас довольно строгая политика в отношении нашего репозитория subversion, что также является большим неудобством. В наших ветках все, что проверяется на подрывную деятельность, должно иметь отредактированные учетные данные для аутентификации (например, база данных, учетные записи пользователей и т. Д.). Файл был добавлен и зафиксирован как с именами, так и с паролями. Существует три версии этого xml-файла:

Первый - Файл был добавлен и зафиксирован с некоторым несоответствующим (к этому вопросу) содержанием.
Второй - Файл (среди трех других нерелевантных файлов) был зафиксирован с учетными данными аутентификации как часть совершенно нового блока XML.
Третий - Были добавлены и проверены другие файлы, ни одна из которых не является более новой версией плохого файла из предыдущей версии.
Четвертый - Один неверный файл был снова зарегистрирован с удаленными учетными данными для аутентификации (в частности, ни с чем другим).

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

В настоящее время нет obliterate функциональность в Subversion. Это обсуждалось несколько раз, но это нарушает целостность репозитория и еще предстоит реализовать.

ПРЕДУПРЕЖДЕНИЕ: Эта ссылка обсуждается в течение 11 лет. svn obliterate.

Обходной путь - создать резервную копию репозитория с помощью svnadmin dump (ССЫЛКА НА САЙТ), а затем восстановите репозиторий, используя svndumpfilter (ССЫЛКА НА САЙТ) предотвращение добавления конкретных ревизий в восстановленный репозиторий.

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

svnadmin dump repolocation > file.dump

Вам нужно открыть файл file.dump в текстовом редакторе и найти ревизию, в которую был добавлен файл. Найдите номер версии: xxx, где xxx - это версия, в которую был добавлен второй файл. Ниже вы найдете такой блок, как

Node-path: trunk/my/file1.txt
Node-kind: file
Node-action: change
Text-content-length: 14
Text-content-md5: c0bf20e1c2a520acddd3fccc2b9c5781
Text-content-sha1: 83162b1f0ca7b6e6816d2bc8f44550915fa2f4b7
Content-length: 14

contentsinfile

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

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

Там, где я показываю содержимое файла выше, вы найдете содержимое второго зафиксированного файла, включая пароли. Вы должны отредактировать пароли, но сохранить длину текста такой же! Это сделано для того, чтобы параметры Content-length и Text-content-length были правильными! (Вы также можете отрегулировать длину, но вы ищете больше проблем) Однако проблема в том, что контрольные суммы md5 и sha1, которые вы видите выше, не совпадают. Вам нужно будет сгенерировать новые md5 и sha1 на основе измененного содержимого файла, что может быть довольно сложно, но не слишком сложно!

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

svnadmin create newrepo
svnadmin load newrepo < file.dump