Django 마이그레이션 파일을 파일에 추가해야합니까 .gitignore
?
최근 마이그레이션 충돌로 인해 많은 자식 문제가 발생했으며 마이그레이션 파일을 무시로 표시해야하는지 궁금합니다.
그렇다면 내 앱에있는 모든 마이그레이션을 추가하고 .gitignore
파일에 추가하려면 어떻게해야합니까?
답변
Django 마이그레이션 문서 에서 인용 :
각 앱의 마이그레이션 파일은 해당 앱 내부의 “migrations”디렉토리에 있으며 해당 코드베이스에 커밋되고 일부로 배포되도록 설계되었습니다. 개발 컴퓨터에서 한 번 만든 다음 동료의 컴퓨터, 스테이징 컴퓨터 및 결국 프로덕션 컴퓨터에서 동일한 마이그레이션을 실행해야합니다.
이 프로세스를 따르면 마이그레이션 파일에서 병합 충돌이 발생하지 않아야합니다.
버전 제어 분기를 병합 할 때 동일한 상위 마이그레이션을 기반으로 여러 마이그레이션이있는 상황이 발생할 수 있습니다 (예 : 다른 개발자에게 동시에 마이그레이션을 도입 한 경우). 이 상황을 해결하는 한 가지 방법은 _merge_migration_을 도입하는 것입니다. 종종 이것은 다음 명령을 사용하여 자동으로 수행 될 수 있습니다.
./manage.py makemigrations --merge
현재의 모든 헤드 마이그레이션에 의존하는 새로운 마이그레이션을 소개합니다. 물론 이것은 헤드 마이그레이션간에 충돌이없는 경우에만 작동하며이 경우 수동으로 문제를 해결해야합니다.
여기에있는 일부 사람들이 마이그레이션을 버전 제어로 커밋 하지 말아야한다고 제안 했기 때문에 실제로 그렇게 해야하는 이유를 확장하고 싶습니다 .
먼저, 프로덕션 시스템에 적용된 마이그레이션 기록이 필요합니다. 프로덕션에 변경 사항을 배포하고 데이터베이스를 마이그레이션하려는 경우 현재 상태에 대한 설명이 필요합니다. 각 프로덕션 데이터베이스에 적용된 마이그레이션의 별도 백업을 만들 수 있지만 이는 불필요하게 번거로운 것 같습니다.
둘째, 마이그레이션에는 종종 사용자 지정 손으로 작성한 코드가 포함됩니다. .NET을 사용하여 자동으로 생성하는 것이 항상 가능한 것은 아닙니다 ./manage.py makemigrations
.
셋째, 마이그레이션은 코드 검토에 포함되어야합니다. 이는 프로덕션 시스템에 중요한 변경 사항이며 문제가 될 수있는 많은 것들이 있습니다.
즉, 프로덕션 데이터에 관심이 있다면 버전 관리로의 마이그레이션을 확인하십시오.
답변
아래 절차를 따를 수 있습니다.
makemigrations
로컬에서 실행할 수 있으며 마이그레이션 파일이 생성됩니다. 이 새 마이그레이션 파일을 repo에 커밋합니다.
제 생각 makemigrations
에는 프로덕션에서 전혀 실행해서는 안됩니다 . migrate
프로덕션에서 실행할 수 있으며 로컬에서 커밋 한 마이그레이션 파일에서 마이그레이션이 적용되는 것을 볼 수 있습니다. 이렇게하면 모든 충돌을 피할 수 있습니다.
LOCAL ENV 에서 마이그레이션 파일을 만들려면
python manage.py makemigrations
python manage.py migrate
이제 다음과 같이 새로 생성 된 파일을 커밋합니다.
git add app/migrations/...
git commit -m 'add migration files' app/migrations/...
PRODUCTION ENV 에서 아래 명령 만 실행하십시오.
python manage.py migrate
답변
2018 년 문서, Django 2.0에서 인용. (두 개의 개별 명령 = makemigrations
및 migrate
)
마이그레이션을 수행하고 적용하는 별도의 명령이있는 이유는 마이그레이션을 버전 제어 시스템에 커밋하고 앱과 함께 제공하기 때문입니다. 개발을 더 쉽게 할뿐만 아니라 다른 개발자와 프로덕션에서도 사용할 수 있습니다.
답변
요약 : 마이그레이션 커밋, 마이그레이션 충돌 해결, git 워크 플로 조정.
충돌을 무시하는 대신 git 워크 플로 를 조정해야 할 것 같습니다 .
이상적으로는 모든 새로운 기능이 다른 브랜치에서 개발되고 풀 리퀘스트로 다시 병합됩니다 .
충돌이 있으면 PR을 병합 할 수 없으므로 기능을 병합해야하는 사람은 충돌을 해결해야하며 마이그레이션도 포함됩니다. 다른 팀 간의 조정이 필요할 수 있습니다.
마이그레이션 파일을 커밋하는 것이 중요합니다! 충돌이 발생하면 Django는 이러한 충돌을 해결하는 데 도움을 줄 수도 있습니다 .)
답변
어떻게 든 마이그레이션을 편집하지 않는 한 충돌이 발생하는 이유 를 상상할 수 없습니까? 그것은 일반적으로 나쁘게 끝납니다. 누군가 중간 커밋을 놓치면 올바른 버전에서 업그레이드하지 않고 데이터베이스 복사본이 손상됩니다.
제가 따르는 프로세스는 매우 간단합니다. 앱의 모델을 변경할 때마다 마이그레이션도 커밋하면 마이그레이션이 변경되지 않습니다 . 모델에서 다른 것이 필요하면 모델을 변경하고 커밋합니다. 변경 사항과 함께 새로운 마이그레이션.
그린 필드 프로젝트에서는 종종 마이그레이션을 삭제하고 릴리스 할 때 0001_ 마이그레이션으로 처음부터 다시 시작할 수 있지만 프로덕션 코드가 있으면 불가능합니다 (마이그레이션을 하나로 스쿼시 할 수 있음).
답변
일반적으로 사용되는 솔루션은 어떤 것이 마스터로 병합되기 전에 개발자가 원격 변경 사항을 가져와야한다는 것입니다. 마이그레이션 버전에 충돌이있는 경우 로컬 마이그레이션의 이름을 변경해야 합니다 (원격 마이그레이션은 다른 개발자에 의해 실행되었으며 잠재적으로 프로덕션 단계에 있음).
개발 중에는 마이그레이션을 커밋하지 않는 것이 좋습니다 (무시를 추가하지 말고 그냥 추가하지 마십시오 add
). 그러나 일단 프로덕션에 들어간 후에는 스키마를 모델 변경과 동기화하기 위해 필요합니다.
그런 다음 파일을 편집 dependencies
하고을 최신 원격 버전으로 변경해야 합니다.
이는 Django 마이그레이션 및 기타 유사한 앱 (sqlalchemy + alembic, RoR 등)에서 작동합니다.
답변
git에 마이그레이션 파일이 많이있는 것은 지저분합니다. 마이그레이션 폴더에는 무시하면 안되는 파일이 하나뿐입니다. 이 파일은 init .py 파일입니다. 무시하면 python은 더 이상 디렉토리 내의 하위 모듈을 찾지 않으므로 모듈을 가져 오려는 시도는 실패합니다. 따라서 질문은 모든 마이그레이션 파일을 무시하고 초기화 하는 방법이어야합니다. .py를 . 해결책은 : .gitignore 파일에 ‘0 * .py’를 추가하면 완벽하게 작동합니다.
이것이 누군가를 돕기를 바랍니다.