Fix conflicting Django migrations (numbered styles) using plain git CLI, with robust support for normal repos and git worktrees. No GitPython dependency.
This is a fork and drop-in replacement for django-migration-fixer which is not actively maintained by the author.
- Detects conflicting leaf nodes and renumbers local migrations to form a single linear chain.
- Rewrites
dependenciesto point to the last migration on the default branch. - Works in git worktrees by discovering the repo root via
git rev-parse --show-toplevel.
uv pip install django-modern-migration-fixerAdd to your Django settings:
INSTALLED_APPS = [
# ...
"django_modern_migration_fixer",
# ...
]./manage.py makemigrations --fix [apps...]Useful flags:
-b, --default-branch: Name of the default branch (default:master).-r, --remote: Git remote (default:origin).-s, --skip-default-branch-update: Skip fetching remote default branch.-f, --force-update: Force update the default branch refs before fixing.
Examples:
./manage.py makemigrations --fix
./manage.py makemigrations --fix -b master --skip-default-branch-update
./manage.py makemigrations --fix -r upstream --force-update- On a
Conflicting migrationserror, the command:- Verifies the repo is clean.
- Optionally fetches the default branch.
- Resolves default-branch and HEAD SHAs robustly.
- Loads the migration graph and finds conflicts per app.
- Filters changed migration files under the app’s migration folder between default SHA and HEAD.
- Renumbers local files and rewrites dependencies to form a single chain.
- Only supports numbered migration file names (e.g.,
0001_initial). Non-numbered names fail fast with a clear message. - Cross-app dependency rewrites beyond simple renumbering are out of scope.
Convenient shortcuts are available via make:
make tests— Run unit and e2e tests (unittest discovery).make tests-unit— Discover and run tests undertests/unit.make tests-e2e— Discover and run tests undertests/e2e(safe if empty).make build—uv sync --extra devthenuv buildto produce wheels/sdist.make distribute—twine checkthen upload artifacts indist/to PyPI.
Notes:
- Test runs set
PYTHONPATH=srcso the package imports without installation. buildanddistributerequireuvto be installed and available on PATH.
MIT