Как удалить 1 файл из ревизии в SVN? - PullRequest
8 голосов
/ 29 августа 2008

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

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

Ответы [ 8 ]

11 голосов
/ 29 августа 2008
7 голосов
/ 29 августа 2008
3 голосов
/ 29 августа 2008

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

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

2 голосов
/ 07 января 2009

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

вы можете '' svnadmin dump '' создавать ваши репозитории в файл, искать и заменять ваш пароль на 'ultrasecret', '' svnadmin создавать '' новые репозитории и '' svnadmin загружать '' модифицированный дамп в эти новые репозитории знать о двоичных данных в вашем дампе, поэтому используйте подходящий редактор / sed.

2 голосов
/ 11 сентября 2008

Если это последняя ревизия (HEAD), вы можете ( BACKING UP ваше хранилище заранее) удалить файлы этой ревизии в db\revs и db\revprops и затем запустить следующий python скрипт для исправления того, какую ревизию вы считаете репозиторием HEAD.

например. если 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()
2 голосов
/ 29 августа 2008

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

0 голосов
/ 29 августа 2008

Это, похоже, сработало. Итак, что я сделал:

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

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

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

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

0 голосов
/ 29 августа 2008

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

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