- А не запилить ли мне свой .git с преферансом и блудницами, — подумал я. И запилил! По крайней мере, малюсенькую часть, а именно папку .git/objects. Формат хранения обычных файлов простой — берем sha1 от данных этого файла, создаем папку из первых двух символов этого хеша, а внутрь заливаем пакованные данные с именем оставшегося хеша.
Вот такой скрипт получился на питоне. Зачем делал — не спрашивайте, не знаю. :)
import os
import hashlib
import zlib
# Какие папки сканируем
directories = ( "D:\\resources", )
# Какие файлы учитываем
extensions = ( '.png', '.wav', '.jpg', '.dds' )
# Количество повторов
numDuplicates = 0
# Общее количество обработанных файлов
numFiles = 0
for directory in directories:
for root, dirs, files in os.walk(directory):
for filename in files:
basename, ext = os.path.splitext(filename)
full = os.path.join(root, filename)
# Пропустим неизвестный файл
if ext not in extensions:
print 'Skip %s' % full
continue
# Понеслась!
print 'Processing %s' % full,
# Возьмем хеш от содержимого файлов
data = open(full, 'rb').read()
hash = hashlib.sha1(data).hexdigest()
print '.. done'
# Название папки - первые два символа от хеша
prefix = hash[:2]
# Название файла - остальные символы хеша
postfix = hash[2:]
# Создадим подпапку в папочке objects
dirname = os.path.join('objects', prefix)
if not os.path.isdir(dirname):
os.makedirs(dirname)
# Выходной файл с данными
filename = os.path.join(dirname, postfix)
if not os.path.isfile(filename):
# Пишем данные, предварительно запаковав их с помощью zlib
open(filename, 'wb').write(zlib.compress(data))
else:
# Такой файл уже есть, найден дубликат, куда смотрел дизайнер?!
numDuplicates += 1
numFiles += 1
# Краткий отчет
print 'Total: %d, duplicates: %d' % (numFiles, numDuplicates)