병합 드라이버를 사용하여 package-lock.json에서 Git 충돌 해결

4539 단어 gitnpmgithubnode
package-lock.json , yarn.lock , Gemfile.lock 와 같은 자동 생성 파일 또는 Git 리포지토리 내에서 XML 형식으로 코드 커버리지 보고서(또는 테스트 결과)를 저장하는 파일을 사용하는 모든 사람은 이러한 파일에서 Git 충돌을 경험했습니다.

이러한 종류의 충돌을 보다 원활하게 해결하는 방법을 살펴보겠습니다.
package-lock.json 파일을 삭제하고 npm install를 다시 실행하거나 Yarn과 유사하게 실행할 수 있다는 것을 알고 계실 것입니다.

rm package-lock.json
npm install
git add package-lock.json


그러나 Git은 이 문제를 자동으로 해결할 수 있습니다(또한 이 솔루션은 다른 자동 생성 파일 및 바이너리 파일(예: 이미지)에 대해 작동합니다).

힘내 속성



Git이 파일을 처리하는 방법을 수동으로 구성할 수 있는 Git 리포지토리의 루트에 배치된 .gitattributes 이라는 특수 파일을 생성할 수 있습니다. 예를 보자:

# Auto detect text files and perform LF normalization
* text=auto

# JS and TS files must always use LF for tools to work
*.js eol=lf
*.ts eol=lf

# Use UTF-16 instead of UTF-8 for C source files.
*.c working-tree-encoding=UTF-16LE-BOM

# Mark all JPEG files as binary.
*.jpg binary

# Handle as a text file but merge as binary.
package-lock.json merge=binary


기본 제공 바이너리 병합 드라이버는 바이너리 파일을 병합할 수 없으므로 충돌이 발생하는 경우 Git은 사용자package-lock.json를 그대로 두지만 충돌 상태로 표시됩니다.

💡 Git 리포지토리의 모든 사용자에게 적용하는 대신 이 속성을 유지하려면 동일한 구조의 .git/info/attributes 파일을 사용할 수 있습니다.

업스트림 브랜치의 변경 사항이 필요한 경우 해당 버전을 확인하십시오.

git checkout --theirs package-lock.json


이는 사용자 지정 병합 드라이버를 사용하여 수행할 수도 있습니다. 👐

Git 병합 드라이버



병합 드라이버는 Git 충돌을 해결하려고 시도하며 사용자가 해결할 수 있습니다create your own. 우리 버전( theirs )보다 업스트림 버전( %B )을 사용할 %A라는 드라이버를 정의해 보겠습니다.

git config --global merge.theirs.name "Keep upstream changes"
git config --global merge.theirs.driver "cp -f '%B' '%A'"


💡 --global를 사용하여 컴퓨터의 모든 리포지토리에서 이 드라이버를 사용할 수 있도록 합니다.

그런 다음 .gitattributes (또는 .git/info/attributes 또는 ~/.config/git/attributes ) 파일에 다음을 추가합니다.

package-lock.json merge=theirs


이제 모든 충돌은 업스트림 버전을 수락하는 드라이버에 의해 해결됩니다. npm install에 변경 사항을 다시 추가하려면 package-lock.json를 실행해야 합니다. 이 드라이버는 충분히 똑똑하지 않기 때문에 잠금 파일에 대한 변경 사항을 무시합니다. package.json에 대한 변경 사항과 파일을 동기화 상태로 유지해야 합니다.

npm 병합 드라이버



npm 팀은 이전 드라이버보다 더 스마트하게 병합하는 npm-merge-drive을 만들었습니다. 이 드라이버는 덮어쓰기 😁를 수행하여 잠금 파일을 package.json의 변경 사항과 동기화 상태로 유지합니다. 복제된 모든 리포지토리에 ~/.config/git/attributes가 사용되기 때문에 동료에게 영향을 주지 않고 시스템에 전역적으로 설치할 수 있습니다.

npx npm-merge-driver install --global


나쁜 부분은 이 리포지토리가 보관되어 있으며 어떤 업데이트도 수신하지 않는다는 것입니다. 🐛

git-json-merge 과 같은 다른 유형의 파일에 대해서도 npm 레지스트리에서 다른 병합 드라이버를 찾을 수 있습니다.

결론



이제 .gitattributes 를 사용하여 줄 끝과 fix encodings on Windows 을 처리하는 방법을 배웠습니다.

자동 생성된 파일을 binary 또는 텍스트로 처리할 수 있지만 merge=binary를 사용하거나 내장되지 않은 드라이버를 사용하여 자동으로 병합합니다.

이러한 대용량 파일을 바이너리로 처리하는 long discussions about이 있습니다. Git은 모든 변경 사항을 압축하므로 저장소 크기가 바이너리package-lock.json 파일로 손상되지 않습니다. 그것은 당신에게 달려 있습니다.

의견에서 이러한 유형의 Git 충돌을 관리하는 방법을 알려주십시오.

좋은 웹페이지 즐겨찾기