From 4e6f822e6a54585fb8b8e18007695c2d42ac0bfc Mon Sep 17 00:00:00 2001 From: "simon.parzer@f837bbade0d93f560dc574b04e835b7875c4026f" Date: Thu, 5 May 2016 11:58:31 +0000 Subject: [PATCH] Added a comment: Python script to recover git annex' lost files --- ..._37eaed2d7afa0c064e1b30a6f1e4dc01._comment | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 doc/forum/files_got_replaced_by_broken_symblinks__44___how_to_get_them_back__63__/comment_7_37eaed2d7afa0c064e1b30a6f1e4dc01._comment diff --git a/doc/forum/files_got_replaced_by_broken_symblinks__44___how_to_get_them_back__63__/comment_7_37eaed2d7afa0c064e1b30a6f1e4dc01._comment b/doc/forum/files_got_replaced_by_broken_symblinks__44___how_to_get_them_back__63__/comment_7_37eaed2d7afa0c064e1b30a6f1e4dc01._comment new file mode 100644 index 0000000000..194f92d325 --- /dev/null +++ b/doc/forum/files_got_replaced_by_broken_symblinks__44___how_to_get_them_back__63__/comment_7_37eaed2d7afa0c064e1b30a6f1e4dc01._comment @@ -0,0 +1,49 @@ +[[!comment format=mdwn + username="simon.parzer@f837bbade0d93f560dc574b04e835b7875c4026f" + nickname="simon.parzer" + subject="Python script to recover git annex' lost files" + date="2016-05-05T11:58:31Z" + content=""" +Maybe someone else needs this too :| +Use it at your own risk of course. +``` +#!python3 + +import os +import re +from shutil import copyfile + +targets = {} + +for path, dirs, files in os.walk('.'): + for f in files: + fp = os.path.join(path, f) + if fp.endswith('.py'): continue + fp_size = os.stat(fp).st_size + if fp_size < 72 or fp_size > 256: continue + with open(fp, 'r', encoding='latin1') as stream: + l = stream.readline() + hashmatch = re.match('.*SHA256E\-\w+\-\-(\w{16})', l) + if hashmatch: + targets[hashmatch.group(1)] = os.path.abspath(fp) + +#print(targets) + +target = os.path.abspath('.') +while not os.path.exists('.git/annex/objects'): + os.chdir('..') + +for path, dirs, files in os.walk('.git/annex/objects'): + for f in files: + fp = os.path.join(path, f) + fp_size = os.stat(fp).st_size + if fp_size > 512: + hashmatch = re.match('.*SHA256E\-\w+\-\-(\w{16})', fp) + if hashmatch: + hash = hashmatch.group(1) + if hash in targets: + print(fp, '->', targets[hash]) + copyfile(fp, targets[hash]) + +``` +"""]]