이 기사는 GIT 웨어하우스 슬리밍 및 GIT LFS 마이그레이션 지침에 대한 관련 지식을 제공하므로 모든 사람에게 도움이 되기를 바랍니다.
이전에 일부 git 프로젝트에서 CI/CD를 사용했는데, jenkins git clone이 실패하고 깊이 및 복제 시간 설정에 실패했음을 발견했습니다. 창고 축소와 같은 전략만 고려할 수 있습니다. 웨어하우스에는 많은 바이너리 파일이 있고 이러한 바이너리 파일이 매우 자주 변경되는 것으로 나타났습니다. 이 작업으로 인해 Git 웨어하우스는 기하급수적으로 늘어나고 Git 자체는 텍스트 파일 관리에만 적합합니다.
또 다른 흥미로운 이야기는 그래픽 프로그래밍에 관심이 있는 동료가 있었다는 것입니다. 이 언어의 소스 코드는 이미지 형식이었고 파일이 매우 커서 git에서 관리되었으며 소규모 회사의 프로젝트가 변경되었습니다. 이로 인해 얼마 지나지 않아 git 서버 하드 디스크가 실제로 그의 git 저장소 중 일부로 가득 차게 되었습니다.
git은 바이너리 파일 관리에 적합한 적이 없었지만 이제 git은 대용량 파일 관리를 위해 특별히 설계된 플러그인인 git lfs를 기본적으로 제공하는 것 같습니다.
기본 원리는 단순히 실제 파일 저장 대신 파일 포인터(텍스트)를 사용하는 것입니다. git은 전체 바이너리 파일이 아닌 파일 포인터의 변경 내역만 저장하고 사용 시 자동으로 Hook을 제공하므로 편리합니다. clone, pull, 재설정 및 기타 작업의 경우 이러한 파일 포인터의 소스 바이너리 파일을 자동으로 얻습니다. 마찬가지로 바이너리 파일 커밋을 업데이트할 때 git은 자동으로 소스 파일을 파일 포인터로 변환하고 이를 git log에 입력합니다. 동시에 소스 파일이 lfs에 업로드됩니다. 따라서 사용자 수준에서 GIT LFS를 사용하는 것은 실제로 의미가 없습니다.
위에서는 GIT LFS에 대해 간략하게 소개합니다. 다음으로 LFS를 처음부터 사용하는 방법이 아닌 마이그레이션에 대해 직접 이야기하는 이유에 대해 설명하겠습니다.
git Warehouse를 사용하다 보면 종종 웨어하우스가 너무 크고 clone이 너무 느리다는 것을 알게 되면서 LFS를 사용해보고 싶다는 생각을 하게 되기 때문입니다.
마이그레이션을 위해서는 웨어하우스의 관리자 권한이 필요하고 보호된 지점의 보호를 해제해야 합니다.
구체적인 LFS 마이그레이션은 주로 다음 단계로 나뉩니다.
마이그레이션하기 전에 백업을 하고 팀 동료들과 잘 소통하는 것이 가장 좋습니다. 결국 작업에는 -f 고위험 작업이 포함되며 비난을 받기 쉽습니다.
자체 구축된 Git 서비스를 구축하는 경우 gitlab과 같은 서버 측에서 LFS를 활성화해야 할 수도 있습니다.
이 플러그인은 Windows용 git 설치 패키지와 함께 제공됩니다. 다른 플랫폼에서 직접 설치할 수 있습니다.
명령줄에서 다음 명령을 사용해 보세요.
git lfs
도움말 문서와 유사한 정보 출력이 있으면 이미 git lfs 클라이언트가 있다는 의미입니다.
git-lfs/2.11.0 (GitHub; windows amd64; go 1.14.2; git 48b28d97)git lfs <command> [<args>]Git LFS is a system for managing and versioning large files in association with a Git repository. Instead of storing the large files within the Git repository as blobs, Git LFS stores special "pointer files" in the repository, while storing the actual file contents on a Git LFS server. The contents of the large file are downloaded automatically when needed, for example when a Git branch containing the large file is checked out.Git LFS works by using a "smudge" filter to look up the large file contents based on the pointer file, and a "clean" filter to create a new version of the pointer file when the large file's contents change.It also uses a pre-push hook to upload the large file contents to the Git LFS server whenever a commit containing a new large file version is about to be pushed to the corresponding Git server.</args></command>
그런 다음 LFS 글로벌 환경을 구성하려면 다음 명령을 실행해야 합니다. 한 번만 구성하면 되며 현재 웨어하우스의 후크도 동시에 업데이트됩니다
git lfs install
lfs 마이그레이션의 기본 아이디어: lfs 로컬 기록 다시 쓰기 —>force push는 원격 끝을 덮어써 마이그레이션 효과를 얻습니다.
따라서 로컬 웨어하우스를 원격 웨어하우스와 동기화하고 모든 원격 브랜치에 대한 로컬 브랜치를 생성하는 것이 좋습니다.
그런 다음 로컬 웨어하우스로 이동하여 다음 명령을 실행합니다. –include에는 glob 표현식이 포함되어 있으며 직접 LFS를 추가합니다. 관리되는 파일의 이름, –everything은 모든 로컬 브랜치를 나타냅니다
git lfs migrate import --include="*.bin,*.lib,*.so,*.dll,*.a,*.param,*.zip,*.gz" --everything
migrate: Sorting commits: ..., done. migrate: Rewriting commits: 100% (193/193), done. develop bacb490a80ea46d73bd3866c2e7cf7ad199ce5eb -> 72884bcb4629417bad73ea3d485d08a0708909cd feature/npu-platform a3645632756becc527c7f4d58514b3c479f824d3 -> e227900a3903b3a6955e4dffee48daeceac6cdff master 1ccdecdcb4b5d6224a6e24c6f87793bfcc15ee4c -> 1d9fc2139600ef3d92a20d65bb5db89021b8c488 0.1.0 07c6b2aa732506f1cc88cedb551f37f376b6efa6 -> 8e55193221dfca9f6bb28ccd9cca85af9c5958c9 1.0.0 0f694efcd7aa9df641836e1ea6eebbb730b940b5 -> 3f9e77575120b6e56b34790c998a362116da75f5 migrate: Updating refs: ..., done.
로컬 브랜치, 태그 등을 다시 작성한 후
먼저 여기에서 git lfs ls-files를 실행하여 어떤 파일이 lfs 관리로 변환되었는지 확인할 수 있습니다. 누락된 부분이 있는지 확인해주세요
이때, 어느 브랜치에 있든 .gitattributes 파일이 나타나며, 다음과 비슷한 내용이 추가됩니다.
*.bin filter=lfs diff=lfs merge=lfs -text *.lib filter=lfs diff=lfs merge=lfs -text *.so filter=lfs diff=lfs merge=lfs -text *.dll filter=lfs diff=lfs merge=lfs -text *.a filter=lfs diff=lfs merge=lfs -text *.param filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.gz filter=lfs diff=lfs merge=lfs -text
동시에 모든 바이너리 파일이 다음 형식의 텍스트로 변환된 것을 볼 수 있습니다
version https://git-lfs.github.com/spec/v1 oid sha256:9171c8350d72ccca6ad60ac80b577157ad1f9fd44ca05744216e02ccbfcdf491 size 10260
올바른지 확인한 다음 원격 엔드로 푸시할 수 있습니다.
lfs는 모든 커밋을 다시 작성하고 해시 값을 수정하므로 –froce를 추가해야 합니다
이 단계에서는 보호된 브랜치를 취소해야 합니다(보호된 브랜치는 -f일 수 없음)
git push --force --all
이렇게 하면 원격 웨어하우스의 lfs 마이그레이션이 완료됩니다.
git lfs pull
git reflog expire --expire-unreachable=now --all git gc --prune=now
lfs直观来讲更多的是针对仓库大clone慢的问题,我这边lfs迁移前后各备份各一个小型远程仓库做测试,
用的测试仓库二进制文件比较小,总大50m内,且变更次数也在个位数。
clone下来的仓库大小对比。
和我预估差不多,总的来说更适合二进制文件频繁变更,如果单纯是文件大,但文件不变更的话,在clone的时候区别不大,毕竟lfs在clone仍有下载源文件的步骤,除开下载,操作文件指针对git来说理论仍会有性能提升,但是可能感知不强。
推荐学习:《Git教程》
위 내용은 10분 안에 GIT 웨어하우스 슬리밍 및 GIT LFS 마이그레이션 지침을 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!