Как удалить 1 файл из ревизии в SVN?

Один из моих коллег проверил несколько файлов в SVN, и в одном из файлов есть пароль. Пароль был удален из файла и зарегистрирована новая версия, но очевидно, что пароль все еще находится в репозитории, если мы посмотрим на историю изменений и перейдем к этой версии. (Мы используем TortoiseSVN в качестве клиента.)

Итак, как мне безопасно удалить этот единственный файл из репозитория в SVN?


svn
person Guy    schedule 29.08.2008    source источник


Ответы (8)


ссылка на FAQ по Subversion

person Jason Baker    schedule 29.08.2008


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

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

person Damien B    schedule 29.08.2008

Возможно, вам следует изменить свой производственный пароль, чтобы вообще избежать проблемы с svn.

person Mike Thompson    schedule 29.08.2008

Если это последняя ревизия (HEAD), вы можете (РЕЗЕРВИРОВАНИЕ своего репозитория заранее) удалить файлы этой ревизии в db\revs и db\revprops, а затем запустить следующий скрипт Python, чтобы исправить, какая ревизия вы считаете, что HEAD есть.

например если заголовок 522, а пароль был зафиксирован в 520, вам придется удалить ревизии 520, 521 и 522.

(В этом скрипте нет необходимости после реализации удаления SVN)

(Я не писал этот скрипт, я взял его здесь)

#!/usr/bin/python

def dec_to_36(dec):
  key = '0123456789abcdefghijklmnopqrstuvwxyz'
  result = ''
  while 1:
    div = dec / 36
    mod = dec % 36
    dec = div
    result = key[mod] + result
    if dec == 0:
      break
  return result


import os, re, sys

repo_path = sys.argv[1]
rev_path = os.path.join(repo_path, 'db', 'revs')
current_path = os.path.join(repo_path, 'db', 'current')

id_re = re.compile(r'^id:\ ([a-z0-9]+)\.([a-z0-9]+)\.r([0-9]+).*')

max_node_id = 0
max_copy_id = 0
max_rev_id = 0

for rev in os.listdir(rev_path):
  f = open(os.path.join(rev_path, rev), 'r')

  for line in f:
    m = id_re.match(line)
    if m:
      node_id = int(m.group(1), 36)
      copy_id = int(m.group(2), 36)
      rev_id = int(m.group(3), 10)

      if copy_id > max_copy_id:
        max_copy_id = copy_id

      if node_id > max_node_id:
        max_node_id = node_id

      if rev_id > max_rev_id:
        max_rev_id = rev_id

f = open(current_path, 'w+b')
f.write("%d %s %s\n" % (max_rev_id, dec_to_36(max_node_id+1),
                        dec_to_36(max_copy_id+1)))
f.close()
person Sam Hasler    schedule 11.09.2008
comment
script, кажется, работает, требуется много времени для прогона каждой ревизии, когда вы попадаете в десятки тысяч ревизий. Интересно, насколько безопасно было бы сократить и использовать, скажем, только последние 20 ревизий. - person Greg Domjan; 17.03.2009

ваш пароль все еще там (svn cat file@2342, где 2342 — это версия, файл все еще был там).

вы можете «создать дамп svnadmin» в файл, найти и заменить свой пароль на «сверхсекретный», «svnadmin создать» новый репозиторий и «svnadmin загрузить» измененный дамп в этот новый репозиторий. двоичных данных в вашем дампе, поэтому используйте правильный редактор /sed.

person Community    schedule 07.01.2009

Казалось, это сработало. Итак, что я сделал:

  1. Скопируйте файл в другую папку.
  2. Сделайте удаление TortoiseSVN из текущей папки с последующей фиксацией.
  3. Скопируйте файл обратно в папку.
  4. Добавьте файл с помощью TortoiseSVN и снова зафиксируйте.

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

Таким образом, измененный вопрос теперь будет заключаться в том, как я могу найти историю изменений файла, который был удален, а затем повторно отправлен в SVN?

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

person Guy    schedule 29.08.2008
comment
Процедура, которую вы наметили, разорвет ссылки, так что просмотр текущего файла HEAD и его истории не сможет легко показать вам исходную проверку. Однако, если вы вернете версию к версии до удаления, вы сможете увидеть ее снова. - person Greg Domjan; 17.03.2009

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

person Bernard    schedule 29.08.2008