Git LFS 문제 해결

Git LFS 작업 중 다음과 같은 문제가 발생할 수 있습니다.

포인터여야 했지만 파일 n개를 만났으나 아닌 경우

이 오류는 파일이 LFS에 의해 추적되기를 기대하지만, 리포지터리가 LFS에서 추적하지 않고 있는 것을 나타냅니다. 이 문제의 한 가지 가능한 이유는 다음과 같습니다: 파일이 웹 인터페이스를 통해 업로드될 때 LFS로 추적되지 않음

문제를 해결하려면 영향을 받는 파일(또는 파일)을 마이그레이션하고 리포지터리에 다시 푸시하십시오.

  1. 파일을 LFS로 마이그레이션:

    git lfs migrate import --yes --no-rewrite "<your-file>"
    
  2. 리포지터리에 다시 푸시하십시오:

    git push
    
  3. 선택 사항. .git 폴더를 정리합니다:

    git reflog expire --expire-unreachable=now --all
    git gc --prune=now
    

오류: 리포지터리 또는 개체를 찾을 수 없음

이 오류는 권한 없음, LFS 객체에 액세스를 허용하지 않음 등 몇 가지 이유로 발생할 수 있습니다.

프로젝트에 푸시하거나 프로젝트에서 가져오는 데 권한이 있는지 확인하십시오.

  • 프로젝트가 LFS 객체에 액세스하는 것이 허용되지 않음

푸시하거나 프로젝트에서 가져오려는 LFS 객체가 프로젝트에 더 이상 사용할 수 없습니다. 아마도 해당 객체가 서버에서 제거되었을 수 있습니다.

  • 로컬 Git 리포지터리가 사용되지 않는 LFS API를 사용 중임

<url>에 대한 잘못된 상태: 501

Git LFS는 실패를 로그 파일에 기록합니다. 이 로그 파일을 보려면 프로젝트 디렉터리에서 다음과 같이:

git lfs logs last

상태로 error 501이 표시되면, 이는 다음과 같은 이유 때문입니다:

  • 프로젝트 설정에서 Git LFS가 활성화되지 않았습니다. 프로젝트 설정을 확인하고 Git LFS를 활성화하십시오.

  • GitLab 서버에서 Git LFS 지원이 활성화되지 않았습니다. GitLab 관리자에게 문의하여 GitLab 서버에서 Git LFS가 활성화되지 않은 이유를 확인하십시오. 지침은 LFS 관리 문서에서 확인할 수 있습니다. LFS 지원을 활성화하는 방법에 대한 지침을 확인하십시오.

  • GitLab 서버에서 지원되는 Git LFS 클라이언트 버전이 아닙니다. git lfs version로 Git LFS 버전을 확인하십시오. 프로젝트의 Git 설정을 확인하여 git lfs -l로 오래된 API의 흔적을 확인하십시오. 구성에 batch = false로 설정되어 있는 경우, 해당 줄을 제거하고 Git LFS 클라이언트를 업데이트하십시오. 버전 1.0.1 이상만 지원됩니다.

getsockopt: 연결이 거부됨

프로젝트에 LFS 객체를 푸시하고 다음과 유사한 오류를 받는 경우, LFS 클라이언트가 HTTPS를 통해 GitLab에 액세스하려고 시도합니다. 그러나 귀하의 GitLab 인스턴스는 HTTP에서 제공됩니다:

Post <URL>/info/lfs/objects/batch: dial tcp IP: getsockopt: connection refused

이 동작은 Git LFS가 Git 구성에 lfsurl이 설정되지 않았을 때 기본적으로 HTTPS 연결을 사용하기 때문에 발생합니다.

이를 방지하려면 프로젝트 Git 구성에서 LFS URL을 설정하십시오:

git config --add lfs.url "http://gitlab.example.com/group/my-sample-project.git/info/lfs"

객체를 푸시할 때 항상 자격 증명이 필요함

note
GitLab은 8.12부터 SSH에 대한 LFS 지원을 추가했습니다. Git LFS 통신은 그래도 HTTP를 통해 이루어지지만, 이제 SSH 클라이언트가 올바른 자격 증명을 Git LFS 클라이언트로 전달합니다. 사용자가 수행해야 할 조치는 없습니다.

Git LFS는 모든 객체에 대해 HTTP 기본 인증을 사용하여 사용자를 인증합니다. 사용자의 HTTPS 자격 증명이 필요합니다.

기본적으로 Git은 사용하는 각 리포지터리의 자격 증명을 기억하는 기능을 제공합니다. 자세한 내용은 공식 Git 설명서를 참조하십시오.

예를 들어, 객체를 푸시할 것으로 예상되는 시간 동안 암호를 기억하도록 Git에 지시할 수 있습니다:

git config --global credential.helper 'cache --timeout=3600'

이렇게 하면 암호가 1시간 동안 기억됩니다. 그 후 Git 작업을 다시 하려면 다시 인증해야 합니다.

OS X를 사용하는 경우 osxkeychain을 사용하여 자격 증명을 저장하고 암호화할 수 있습니다. Windows의 경우 wincred나 Microsoft의 Git Credential Manager for Windows를 사용할 수 있습니다.

사용자 자격 증명을 저장하는 다양한 방법에 대한 자세한 내용은 Git 자격 증명 리포지터리 문서에서 찾을 수 있습니다.

LFS 객체가 푸시될 때 누락됨

GitLab은 푸시할 때 LFS 포인터를 감지하고, 그 파일이 GitLab의 LFS에 이미 존재하는지 확인합니다.

로컬에 LFS가 설치되어 있는지 확인하고 git lfs push --all로 매뉴얼 푸시를 고려하십시오.

GitLab 외부에 LFS 파일을 저장하는 경우 프로젝트에서 lfs_enabled: false로 LFS를 비활성화할 수 있습니다. 이는 프로젝트 API를 통해 수행할 수 있습니다.

외부에서 LFS 객체 호스팅

git config -f .lfsconfig lfs.url https://example.com/<project>.git로 사용자 정의 LFS URL을 설정하여 외부에서 LFS 객체를 호스팅할 수 있습니다.

Nexus Repository와 같은 앱라이언스를 사용하여 LFS 데이터를 저장하는 경우 이렇게 선택할 수 있습니다. 외부 LFS 리포지터리를 사용하는 경우 GitLab은 LFS 객체를 확인할 수 없습니다. 그러면 GitLab LFS 지원이 활성화되어 있는 경우 푸시가 실패합니다.

푸시 실패를 방지하기 위해 프로젝트 설정에서 LFS 지원을 비활성화할 수 있습니다. 이렇게 하면 GitLab LFS 가치 추가(Verifying LFS objects, UI integration for LFS)가 비활성화됩니다.

LFS 객체를 푸시할 때 I/O 타임아웃

다음과 같은 오류가 발생할 수 있습니다:

LFS: Put "http://your-instance.com/root/project.git/gitlab-lfs/objects/cc29e205d04a4062d0fb131700e8bfc8e54c44d0176a8dca22f40b24ef26d325/15": read tcp your-instance-ip:54544->your-instance-ip:443: i/o timeout
error: failed to push some refs to 'ssh://your-instance.com:2222/root/project.git'

네트워크 조건이 불안정한 경우, Git LFS 클라이언트가 파일을 업로드하려고 시도할 때 시간이 초과될 수 있습니다.

이를 해결하는 방법은 클라이언트 활동 타임아웃 값을 더 높게 설정하는 것입니다.

예를 들어, 타임아웃을 60초로 설정하려면:

git config lfs.activitytimeout 60