{"id":23763980,"url":"https://github.com/tomashubelbauer/3mf-zip-uncompressed","last_synced_at":"2026-05-02T01:34:28.350Z","repository":{"id":107985984,"uuid":"479475248","full_name":"TomasHubelbauer/3mf-zip-uncompressed","owner":"TomasHubelbauer","description":"An experiment in seeing how no-compression ZIP file will diff in Git","archived":false,"fork":false,"pushed_at":"2022-04-14T18:00:51.000Z","size":81,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-01T16:42:50.099Z","etag":null,"topics":["3mf","diff","git","store","zip"],"latest_commit_sha":null,"homepage":"https://github.com/prusa3d/PrusaSlicer/issues/8065","language":"Markdown","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TomasHubelbauer.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-04-08T17:07:44.000Z","updated_at":"2025-02-20T00:01:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"93423ca5-5868-4aa9-9647-dcb2bb2bd936","html_url":"https://github.com/TomasHubelbauer/3mf-zip-uncompressed","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/TomasHubelbauer/3mf-zip-uncompressed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2F3mf-zip-uncompressed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2F3mf-zip-uncompressed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2F3mf-zip-uncompressed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2F3mf-zip-uncompressed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TomasHubelbauer","download_url":"https://codeload.github.com/TomasHubelbauer/3mf-zip-uncompressed/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2F3mf-zip-uncompressed/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32520156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T01:12:54.858Z","status":"ssl_error","status_checked_at":"2026-05-02T01:12:54.261Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3mf","diff","git","store","zip"],"created_at":"2024-12-31T22:14:00.505Z","updated_at":"2026-05-02T01:34:28.342Z","avatar_url":"https://github.com/TomasHubelbauer.png","language":"Markdown","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 3MF ZIP Uncompressed\n\nThis is an experiment in seeing whether repacking a 3MF OPC ZIP archive into a\nnew archive with \"store\" compression (uncompressed) will make the changes to the\n3MF file diffable and make the whole file a better fit for version control.\n\nThe process is as follows:\n\n- Start a new project in PrusaSlicer with default settings\n- Right-click the print bed and select Add Shape \u003e Box with default dimensions\n- Save the project as `box.3mf`\n- Run `unzip box.3mf -d box` to extract the 3MF OPC ZIP into a directory `box`\n- Run `zip -r box -0 box` to create a new archive, `box.zip` with no compression\n- Turn off the lock next to the box properties Scale and Size\n- Scale the box up twice the size by setting `50` for its Size on the Z axis\n- Save the project again under the same name\n- Delete the `box` directory to not clash with the `unzip` command\n- Run `unzip box.3mf -d box` again to generate a new extraction of the project\n- Run `zip -r box -0 box` to update the archive with no compression\n\nAt this point, VS Code will detect the ZIP archive is a binary file and will not\ndiff it. It can be forced to view it using the default text editor, but even in\nthat case it will not attempt to diff it.\n\nGitHub will show the file as binary and will not offer a way to force-diff it.\nIt does offer a link to view the raw file, but it downloads the file instead of\ndiffing or at least viewing it in the browser.\n\nSince Git detects binary files not by extension, but by a slice of the file's\ncontents, it will always reject ZIP files because their extension is binary and\nfurther textual content (due to the store compression mode) will not make a\ndifference.\n\nIt is possible to coerce Git into viewing textual diffs of binary files, but at\nthis point, we've strayed too far off the default path and it will give more\ntrouble than it is worth.\n\nThe conclusion, then, is that 3MF cannot be version controlled easily even by\nrepacking with no compression. It's best to stick with unpacking the 3MF into a\ndirectory and versioning the contents of the directory. Or to use textual STL.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomashubelbauer%2F3mf-zip-uncompressed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomashubelbauer%2F3mf-zip-uncompressed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomashubelbauer%2F3mf-zip-uncompressed/lists"}