- А не запилить ли мне свой .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) |