最近在研究git中object,发现git是将所有的commit、文件、目录、tag等信息通过zlib压缩之后进行存储的,要想查看其存储的原文,除了使用原有的git cat-file
命令外,还可以按zlib格式解压文件,得到压缩前原文。
由于并没有现成的zlib解压命令,所以使用python的zlib库写了一段代码,实现了解压zlib格式的文件并打印其内容。
如果原始内容为二进制数据,将其保存到文件里再进行比对或者解析即可。
decompress_zlib.py源码
# -*- coding: utf-8 -*-
import zlib
import sys
# 检查命令行参数数量
if len(sys.argv) != 2:
print("Usage: python decompress_zlib.py <compressed_file>")
sys.exit(1)
# 获取命令行参数中的文件名
compressed_filename = sys.argv[1]
# 尝试打开并读取压缩文件
try:
with open(compressed_filename, 'rb') as file:
compressed_data = file.read()
except FileNotFoundError:
print("File not found: {}".format(compressed_filename))
sys.exit(1)
except Exception as e:
print("File not found: {}".format(compressed_filename))
sys.exit(1)
# 解压数据
try:
decompressed_data = zlib.decompress(compressed_data)
except zlib.error:
print("Decompression failed. The file may not be a valid zlib compressed file.")
sys.exit(1)
# 如果需要,将字节串解码为字符串
try:
decompressed_text = decompressed_data.decode('utf-8')
except UnicodeDecodeError:
print("Decoding failed. The decompressed data may not be UTF-8 text.")
decompressed_text = decompressed_data.hex() # Fallback to displaying the data as hex
# 输出解压后的数据
print(decompressed_text)
使用方法
使用方法:python decompress_zlib.py zlib文件路径
示例:python decompress_zlib.py .git/objects/b5/b6a5a4ee0e9d95c0940d83714f1a7ad7325f80