8

同僚の1人がSVNのいくつかのファイルをチェックインし、ファイルの1つにパスワードが含まれています。パスワードはファイルから削除され、新しいバージョンがチェックインされていますが、リビジョン履歴を確認してそのリビジョンに移動すると、パスワードは明らかにリポジトリに残っています。(クライアントとしてTortoiseSVNを使用しています。)

では、SVNのリポジトリからその単一のファイルを安全に削除するにはどうすればよいですか?

4

8 に答える 8

11

これに関するSubversionFAQエントリへのリンク

于 2008-08-29T01:42:55.120 に答える
7

きれいではありません。リポジトリの履歴からファイルを完全に削除するにはどうすればよいですか?

于 2008-08-29T01:43:38.300 に答える
3

現在、改訂履歴が見つからないようです。ただし、適切な場所を探していない可能性があります。

フォルダーの履歴を見ると、ファイルがまだそこにあったリ​​ビジョンがわかるため、機密ファイルを復元することができます。したがって、それは悪い解決策です。

于 2008-08-29T02:13:47.463 に答える
2

たぶん、svnの問題を完全に回避するために、本番パスワードを変更する必要があります。

于 2008-08-29T01:42:43.077 に答える
2

your password is still there (svn cat file@2342 where 2342 is a revision the file was still there).

you can ''svnadmin dump'' you repos to a file, search and replace you password with "ultrasecret', ''svnadmin create'' a new repos and ''svnadmin load'' the modified dump into that new repos. be aware of binary data in your dump, so use a proper editor/sed.

于 2009-01-07T02:07:16.297 に答える
2

それが最後のリビジョン (HEAD) である場合は、そのリビジョンのファイルを削除してから、次の python スクリプトを実行して、レポが HEAD と見なすリビジョンを修正できます (事前にリポジトリをバックアップします)。db\revsdb\revprops

たとえば、head が 522 で、パスワードが 520 でコミットされた場合、リビジョン 520、521、および 522 を削除する必要があります。

( SVN obliterateが実装されたら、このスクリプトは必要ありません)

(私はこのスクリプトを書きませんでした。ここから取得しました)

#!/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()
于 2008-09-11T14:41:51.300 に答える
0

それはうまくいったようです。だから私がしたことは:

  1. ファイルを別のフォルダーにコピーします。
  2. 現在のフォルダーから TortoiseSVN の削除を行い、その後コミットします。
  3. ファイルをフォルダーにコピーして戻します。
  4. TortoiseSVN を使用してファイルを追加し、再度コミットします。

現在、改訂履歴が見つからないようです。ただし、適切な場所を探していない可能性があります。

したがって、変更された質問は、削除されてからSVNに再送信されたファイルのリビジョン履歴を見つけるにはどうすればよいですか?

(ところで、以前にもっと正確に質問しなかったことをお詫びします。オプションの1つがすべてのリビジョン履歴を消去することであるとは決して言いませんでした。それは私には思い浮かびませんでした。)

于 2008-08-29T02:02:51.513 に答える
-3

わからない。いつでも新しいファイルを作成して最新のリビジョンをそのファイルにコピーし、以前のリビジョン履歴を消去することができます。

于 2008-08-29T01:42:33.403 に答える