在 subversion 存储库中搜索大型签入

Nic*_*eld 7 svn

过去人们将大量文件签入我们的 subversion 存储库,后来后悔了。为了修复它,他们只是删除了目录并进行了另一次签入(在存储库的历史记录中留下了大量文件)。

由于这些大文件是偶然的,并不打算在历史中,我想使用 svndumpfilter 过滤掉它们。有没有什么简单的方法可以找到已签入的大目录?也许按大小排序修订差异?

Nic*_*eld 9

我基本上是通过分析 svndump 文件并使用一个小的 python 脚本找到的:

$ # dump repository to file
$ svnadmin dump /var/lib/svn/ > svn_full_dump.txt

$ # find byte offsets of 'Revision-number' ignoring non-ascii and save in file
$ egrep -boa  '^Revision-number: .+$' svn_full_dump.txt > revisions.txt

$ head revisions.txt 
75:Revision-number: 0
195:Revision-number: 1
664:Revision-number: 2
863:Revision-number: 3
1058:Revision-number: 4
1254:Revision-number: 5
1858:Revision-number: 6

$ # find size of checkins and sort by size
$ python revision_size.py  | sort -nr | head
1971768485 r1528
44453981 r2375
39073877 r1507
34731033 r2394
30499012 r484
...
Run Code Online (Sandbox Code Playgroud)

蟒蛇文件是:

#!/usr/bin/env python

f = file('revisions.txt')

last_offset = 0
last_revision = None

for l in f:
    l = l.strip()
    (offset, middle, revision) = l.split(':')
    offset = int(offset.strip())

    revision_size = offset-last_offset
    if last_revision:
        print '%s r%s'%(revision_size, last_revision.strip())

    last_revision = revision
    last_offset = offset

# will ignore last revision

f.close()
Run Code Online (Sandbox Code Playgroud)

更新:修复了 revision_size 脚本中的一个错误,其中大小与正确的修订版不完全匹配。

  • 为什么要编写脚本,为什么不使用预提交脚本来防止文件超过特定大小(10MB?100MB?随便)。如果您有雄心壮志,您甚至可以添加某种异常机制如果文件具有特定的 svn 属性集或列在 .svnlargefiles 文件(也在 repo 中)或其他类似文件中,则将允许超大文件。 (2认同)