Skip to main content

Create clean ZIP archives that respect .zipignore patterns (gitignore-style).

Project description

ZipIgnore

Create clean ZIP archives that respect .zipignore patterns (gitignore-style).

CI Python License: MIT


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:

  • .zipignore itself (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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zipignore-1.0.0.tar.gz (91.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zipignore-1.0.0-py3-none-any.whl (106.9 kB view details)

Uploaded Python 3

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

Hashes for zipignore-1.0.0.tar.gz
Algorithm Hash digest
SHA256 fcd43452a6f8e96262965807ddbfcb07b5922172768142c371347798d7b90769
MD5 c320db0f314ae78a1ab594658c7ac9e4
BLAKE2b-256 d736ad3ab6710b09fbe7ecbdaefa0f689360023eabcf928392df241d6f87dc5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for zipignore-1.0.0.tar.gz:

Publisher: release.yml on TheSuraj01/SafeZip

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for zipignore-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1aafe116a939711642f1c0fd74b9b582d7b72c6afb011166d9253a74d7ad0e32
MD5 501d6c692d84938ee67148d50d49c5a5
BLAKE2b-256 9076474da2c6880aac619e9000eef19434f97d020f72ae1638634754fa5752b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for zipignore-1.0.0-py3-none-any.whl:

Publisher: release.yml on TheSuraj01/SafeZip

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page