Create clean ZIP archives that respect .zipignore patterns (gitignore-style).
Project description
ZipIgnore
Create clean ZIP archives that respect
.zipignorepatterns (gitignore-style).
The Problem
Standard zip tools have no concept of project-specific exclusions. Every time you archive a project you manually exclude node_modules/, build artifacts, .env secrets, and log files — or you accidentally include them.
The Solution
ZipIgnore reads a .zipignore file from your project (same syntax as .gitignore) and automatically excludes matching files when creating the ZIP archive.
zipignore ./my-project
# → Creates my-project.zip with clean, intentional contents
Installation
Recommended: pipx (isolated global install)
pipx install ZipIgnore
pip
pip install ZipIgnore
From source (contributors)
git clone https://github.com/TheSuraj01/SafeZip.git
cd smartzip
poetry install
Quick Start
1. Create a .zipignore file in your project:
# .zipignore
node_modules/
dist/
build/
*.log
.env
.env.local
**/__pycache__/
**/*.pyc
2. Run ZipIgnore:
zipignore ./my-project
Output:
─────────────── ZIPIGNORE REPORT ───────────────
Excluded:
✗ node_modules/lodash/lodash.js
✗ .env
✗ error.log
Included:
✓ src/app.py
✓ src/utils.py
✓ README.md
Statistics:
Included Files 3
Excluded Files 312
Archive Size 4.2 MB
Archive Path /home/user/my-project.zip
──────────── ✓ Archive created: my-project.zip ────────────
CLI Reference
Basic Usage
zipignore <FOLDER> [OPTIONS]
Options
| Flag | Short | Description |
|---|---|---|
--output PATH |
-o |
Custom output ZIP path (default: {folder}.zip in CWD) |
--dry-run |
Preview inclusions/exclusions without creating an archive | |
--verbose |
-v |
Print each file's include/exclude decision in real time |
--force |
-f |
Overwrite the output file if it already exists |
--version |
Print version and exit | |
--help |
Show help and exit |
Examples
# Archive ./project → creates ./project.zip
zipignore ./project
# Custom output path
zipignore ./project -o release-v1.0.zip
# Dry run — preview only, no archive created
zipignore ./project --dry-run
# Verbose — see every include/exclude decision
zipignore ./project --verbose
# Overwrite existing archive
zipignore ./project --force
# Combine flags
zipignore ./project -o dist/release.zip --verbose --force
.zipignore Reference
.zipignore uses the same syntax as .gitignore (powered by pathspec).
Pattern Syntax
| Pattern | Description | Example Match |
|---|---|---|
node_modules/ |
Directory and all contents | node_modules/lodash/index.js |
*.log |
Wildcard by extension | error.log, logs/access.log |
.env |
Exact filename | .env, config/.env |
temp/* |
Single-level glob | temp/cache.db (not temp/sub/file) |
**/*.pyc |
Recursive wildcard | a/b/c/module.pyc |
!important.log |
Negation — re-include | important.log (if previously matched) |
# comment |
Comment line | (ignored) |
Example .zipignore
# Dependencies
node_modules/
vendor/
# Build artifacts
dist/
build/
*.egg-info/
# Environment & secrets
.env
.env.*
!.env.example
# Logs
*.log
logs/
# Python cache
**/__pycache__/
**/*.pyc
**/*.pyo
# Temporary files
*.tmp
*.temp
temp/
.cache/
# IDE
.idea/
.vscode/
*.swp
# OS
.DS_Store
Thumbs.db
# Test artifacts
.pytest_cache/
htmlcov/
.coverage
Always Excluded
The following are always excluded regardless of .zipignore contents:
.zipignoreitself (tooling artifact, not project content)
Exit Codes
ZipIgnore follows standard UNIX exit code conventions for use in CI/CD pipelines:
| Code | Meaning |
|---|---|
0 |
Success — archive created (or dry run completed) |
1 |
User error — bad path, output exists, all files excluded |
2 |
Internal error — unexpected failure |
Python API
ZipIgnore can also be used as a Python library:
from pathlib import Path
from smartzip import run, ArchiveRequest
request = ArchiveRequest(
target=Path("./my-project"),
output=Path("./my-project.zip"),
dry_run=False,
verbose=False,
force=False,
)
result = run(request)
print(f"Archived {result.file_count} files ({result.size_human})")
Platform Support
| Platform | Status |
|---|---|
| Linux | ✅ Fully supported |
| macOS | ✅ Fully supported |
| Windows | ✅ Fully supported |
ZIP archives created on any platform use POSIX / path separators internally, ensuring consistent extraction on all systems.
Contributing
See docs/contributing.md for guidelines.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zipignore-1.0.0.tar.gz.
File metadata
- Download URL: zipignore-1.0.0.tar.gz
- Upload date:
- Size: 91.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcd43452a6f8e96262965807ddbfcb07b5922172768142c371347798d7b90769
|
|
| MD5 |
c320db0f314ae78a1ab594658c7ac9e4
|
|
| BLAKE2b-256 |
d736ad3ab6710b09fbe7ecbdaefa0f689360023eabcf928392df241d6f87dc5d
|
Provenance
The following attestation bundles were made for zipignore-1.0.0.tar.gz:
Publisher:
release.yml on TheSuraj01/SafeZip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zipignore-1.0.0.tar.gz -
Subject digest:
fcd43452a6f8e96262965807ddbfcb07b5922172768142c371347798d7b90769 - Sigstore transparency entry: 1710950111
- Sigstore integration time:
-
Permalink:
TheSuraj01/SafeZip@28ea45e3e8c4700bc3b659075c73ee05290b2ac6 -
Branch / Tag:
refs/tags/v2.0.1 - Owner: https://github.com/TheSuraj01
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@28ea45e3e8c4700bc3b659075c73ee05290b2ac6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file zipignore-1.0.0-py3-none-any.whl.
File metadata
- Download URL: zipignore-1.0.0-py3-none-any.whl
- Upload date:
- Size: 106.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1aafe116a939711642f1c0fd74b9b582d7b72c6afb011166d9253a74d7ad0e32
|
|
| MD5 |
501d6c692d84938ee67148d50d49c5a5
|
|
| BLAKE2b-256 |
9076474da2c6880aac619e9000eef19434f97d020f72ae1638634754fa5752b7
|
Provenance
The following attestation bundles were made for zipignore-1.0.0-py3-none-any.whl:
Publisher:
release.yml on TheSuraj01/SafeZip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zipignore-1.0.0-py3-none-any.whl -
Subject digest:
1aafe116a939711642f1c0fd74b9b582d7b72c6afb011166d9253a74d7ad0e32 - Sigstore transparency entry: 1710950140
- Sigstore integration time:
-
Permalink:
TheSuraj01/SafeZip@28ea45e3e8c4700bc3b659075c73ee05290b2ac6 -
Branch / Tag:
refs/tags/v2.0.1 - Owner: https://github.com/TheSuraj01
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@28ea45e3e8c4700bc3b659075c73ee05290b2ac6 -
Trigger Event:
push
-
Statement type: