🔥 Release preview
Runs are now idempotent: the same source commits always produce the same monorepo hashes, so pushing twice is a no-op. No more forced pushes on every run.
# First run - pushes new commits
uv run python git-contribution-mapper.py
bash scripts/monorepo-push.sh
# Second run - nothing to push
uv run python git-contribution-mapper.py
bash scripts/monorepo-push.sh
# → Everything up-to-date🚀 Features
- Add
--dry-run/-nflag to preview what would run without making changes - Add
--force-pushflag for when upstream history has changed - Support any Git host, not just GitLab (#8)
- Configure the main branch per-repository via
MAIN_BRANCHenv var (#2)
🐞 Bug fixes
- Fix idempotent runs: set committer date = author date so cherry-picks are deterministic (Fixes #3)
- Fix linear history: use cherry-pick instead of merge to avoid merge commits in the monorepo (Fixes #7)
- Fix commit deduplication: include commit hash in blob content so identical-content commits are preserved (Fixes #4)
💻 Code quality
- Replace
os.system()shell call withshutil.copy()to prevent command injection (#10)