Git에서 대용량 파일 관리 및 저장

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Git은 버전 간의 차이를 쉽게 선택하고 코드를 쉽게 압축하기 때문에 소스 코드의 공간을 작게 유지하는 데 도움이 됩니다. 잘 압축되지 않고 버전 간에 완전히 변경되는 큰 파일(예: 이진 파일)은 Git 리포지토리에 저장될 때 문제가 발생합니다. Git의 빠른 성능은 로컬 스토리지에서 파일의 모든 버전을 처리하고 전환하는 기능에서 비롯됩니다.

리포지토리에 변환할 수 없는 큰 파일(예: 이진 파일)이 있는 경우 변경 내용을 커밋할 때마다 해당 파일의 전체 복사본을 리포지토리에 보관합니다. 이러한 파일의 많은 버전이 리포지토리에 있는 경우 코드를 검사, 분기, 페치 및 복제하는 시간이 크게 증가합니다.

Git에 어떤 종류의 파일을 저장해야 하나요?

종속성이 아닌 소스 코드 커밋

팀에서 편집기 및 도구를 사용하여 파일을 만들고 업데이트할 때 팀이 Git 워크플로의 이점을 누릴 수 있도록 이러한 파일을 Git에 배치해야 합니다. 리포지토리에 다른 형식의 파일(예: DLL, 라이브러리 파일 및 팀이 만들지 않지만 코드가 종속된 기타 종속성)을 커밋하지 마세요. 패키지 관리를 통해 이러한 파일을 시스템에 전달합니다.

패키지 관리는 종속성을 번들로 묶고 패키지를 배포할 때 시스템에 파일을 설치합니다. 패키지는 한 환경에서 테스트된 코드가 동일한 설치된 패키지가 있는 한 다른 환경에서 동일하게 실행되도록 버전이 지정됩니다.

출력 커밋 안 함

빌드 및 테스트에서 이진 파일, 로그, 추적 출력 또는 진단 데이터를 커밋하지 마세요. 소스 코드 자체가 아니라 코드의 출력입니다. 작업 항목 추적 도구 또는 팀 파일 공유를 통해 로그 및 추적 정보를 팀과 공유합니다.

Git에서 자주 업데이트되는 작은 이진 원본 저장

자주 업데이트되지 않는 이진 소스 파일에는 비교적 적은 수의 버전이 커밋되어 있습니다. 파일 크기가 작은 경우 공간을 많이 차지하지 않습니다. 웹, 아이콘 및 기타 작은 아트 자산에 대한 이미지는 이 범주에 속할 수 있습니다. 팀이 일관된 워크플로를 사용할 수 있도록 이러한 파일을 나머지 원본과 함께 Git에 저장하는 것이 좋습니다.

Important

작은 이진 파일조차도 자주 업데이트되는 경우 문제가 발생할 수 있습니다. 예를 들어 100KB 이진 파일에 대한 100개의 변경 내용은 1MB 이진 파일에 대한 10개의 변경 내용만큼의 스토리지를 사용합니다. 업데이트 빈도로 인해 작은 이진 파일은 큰 이진 파일보다 분기 성능이 더 느려집니다.

자주 업데이트되는 대규모 이진 자산을 커밋하지 마세요.

Git은 파일의 기본 버전을 관리한 다음 해당 버전과의 차이점만 deltification이라고 하는 프로세스에 저장합니다. Deltification 및 파일 압축을 사용하면 Git에서 전체 코드 기록을 로컬 리포지토리에 저장할 수 있습니다. 대용량 이진 파일은 일반적으로 버전 간에 완전히 변경되며 이미 압축된 경우가 많습니다. 이러한 파일은 버전 간의 차이가 크므로 Git에서 관리하기가 어렵습니다.

Git은 각 버전의 파일의 전체 콘텐츠를 저장해야 하며 위임 및 압축을 통해 공간을 절약하는 데 어려움이 있습니다. 이러한 파일의 전체 버전을 저장하면 시간이 지남에 따라 리포지토리 크기가 증가합니다. 리포지토리 크기가 증가하면 분기 성능이 저하되고 복제 시간이 늘어나며 스토리지 요구 사항이 확장됩니다.

큰 이진 소스 파일로 작업하기 위한 전략

  • 압축된 데이터 보관 파일은 커밋하지 마세요. 파일의 압축을 풀고 확산 가능한 원본을 커밋하는 것이 좋습니다. Git이 리포지토리의 데이터 압축을 처리하도록 합니다.
  • 컴파일된 코드 및 기타 이진 종속성을 커밋하지 마세요. 원본을 커밋하고 종속성을 빌드하거나 패키지 관리 솔루션을 사용하여 이러한 파일을 버전 지정하고 시스템에 제공합니다.
  • 구성 및 기타 구조화된 데이터를 JSON과 같은 확산 가능한 일반 텍스트 형식으로 저장합니다.

Git LFS란?

버전과 빈번한 업데이트 간에 큰 차이가 있는 원본 파일이 있는 경우 Git LFS(큰 파일 스토리지)를 사용하여 이러한 파일 형식을 관리할 수 있습니다. Git LFS는 리포지토리에 대한 커밋의 큰 파일을 설명하는 데이터를 제공하는 Git 확장입니다. 이진 파일 콘텐츠를 별도의 원격 스토리지에 저장합니다.

스토리지에서 분기를 복제하고 전환하면 Git LFS가 해당 원격 스토리지에서 올바른 버전을 다운로드합니다. 로컬 개발 도구는 리포지토리에 직접 커밋된 것처럼 파일을 투명하게 사용합니다.

이점

Git LFS의 이점은 팀에서 만드는 파일에 관계없이 친숙한 엔드투엔드 Git 워크플로를 사용할 수 있다는 것입니다. LFS는 큰 파일을 처리하여 전체 리포지토리에 부정적인 영향을 주지 않도록 합니다. 또한 버전 2.0부터 Git LFS는 파일 잠금 을 지원하여 팀이 동영상, 사운드 및 게임 맵과 같은 크고 비교할 수 없는 자산을 작업할 수 있도록 지원합니다.

Git LFS는 Azure DevOps Services에서 완전히 지원되고 무료입니다. Visual Studio에서 LFS를 사용하려면 Visual Studio 2015 업데이트 2 이상이 필요합니다. 지침에 따라 클라이언트를 설치하고, 로컬 리포지토리에서 파일에 대한 LFS 추적을 설정한 다음, 변경 내용을 Azure Repos에 푸시합니다.

제한 사항

Git LFS에는 채택하기 전에 고려해야 할 몇 가지 단점이 있습니다.

  • 팀에서 사용하는 모든 Git 클라이언트는 Git LFS 클라이언트를 설치하고 추적 구성이해해야 합니다.
  • Git LFS 클라이언트가 올바르게 설치 및 구성되지 않은 경우 리포지토리를 복제할 때 Git LFS를 통해 커밋된 이진 파일 파일이 표시되지 않습니다. Git은 이진 파일이 아닌 큰 파일(Git LFS가 리포지토리에 커밋하는 파일)을 설명하는 데이터를 다운로드합니다. Git LFS 클라이언트를 설치하지 않고 큰 이진 파일을 커밋하면 이진 파일이 리포지토리로 푸시됩니다.
  • Git은 두 버전에 공통 부모가 있더라도 이진 파일의 두 가지 다른 버전에서 변경 내용을 병합할 수 없습니다. 두 사람이 동시에 같은 파일에서 작업하는 경우 다른 사람의 작업을 덮어쓰지 않도록 변경 내용을 조정하기 위해 함께 작업해야 합니다. Git LFS는 도움이 되도록 파일 잠금 을 제공합니다. 사용자는 작업을 시작하기 전에 항상 이진 파일 자산의 최신 복사본을 끌어오도록 주의해야 합니다.
  • Azure Repos는 현재 Git LFS 추적 파일이 있는 리포지토리에서 SSH(Secure Shell) 사용을 지원하지 않습니다.
  • 사용자가 웹 인터페이스를 통해 이진 파일을 Git LFS용으로 구성된 리포지토리로 끌면 이진 파일이 Git LFS 클라이언트를 통해 커밋되는 포인터가 아니라 리포지토리에 커밋됩니다.
  • 엄격한 파일 크기 제한은 없지만 서버의 사용 가능한 여유 공간과 현재 워크로드는 성능과 기능을 제한할 수 있습니다.
  • 한 파일 업로드에 대한 시간 제한은 1시간입니다.

파일 형식

Git LFS 추적 파일에 대한 리포지토리에 기록된 파일에는 각 줄에 키/값 쌍이 있는 몇 줄이 있습니다.

version https://git-lfs.github.com/spec/v1
oid a747cfbbef63fc0a3f5ffca332ae486ee7bf77c1d1b9b2de02e261ef97d085fe
size 4923023

참고 항목

버전 값에 포함된 GitHub URL은 LFS 포인터 파일 형식만 정의합니다. 이진 파일에 대한 링크가 아닙니다.

알려진 문제

Azure DevOps Server에서 2.4.0 이전 버전의 LFS를 사용하는 경우 Kerberos 대신 NTLM을 통해 인증하려면 추가 설정 단계가 필요합니다. 이 단계는 LFS 2.4.0을 기준으로 더 이상 필요하지 않으며 업그레이드하는 것이 좋습니다.