ОПЕРАЦИЯ · АРХИВЫ
Создать воспроизводимый архив
Зафиксировать порядок, время, права и владельцев обычных файлов.
Предварительные условия
Python 3; каталог input содержит только обычные файлы и каталоги. Не меняйте его во время сборки.
Команда
python3 - <<'PY'
import tarfile
from pathlib import Path
root = Path("input")
with tarfile.open("reproducible.tar", "x", format=tarfile.USTAR_FORMAT) as t:
for p in sorted(root.rglob("*")):
if p.is_symlink() or not (p.is_file() or p.is_dir()): raise ValueError(str(p))
if p.is_dir(): continue
info = tarfile.TarInfo(p.relative_to(root).as_posix())
info.size = p.stat().st_size
info.mtime = 0; info.uid = info.gid = 0
info.mode = 0o644; info.uname = info.gname = ""
with p.open("rb") as f: t.addfile(info, f)
PYОбъяснение аргументов
USTAR ограничивает имена и размеры; пустые каталоги и executable bits намеренно не сохраняются.
Ожидаемый результат
Повторные сборки тем же Python с теми же файлами дают одинаковые байты.
Проверка
Сравните SHA-256 двух сборок под разными именами.
Распространённые ошибки
- Менять дерево во время чтения; ожидать сохранения POSIX-метаданных.
Обратимость
Это нормализованный снимок содержимого, исходники не меняются.