programing

Git 오류: 포인터여야 하지만 그렇지 않은 7개의 파일이 발견되었습니다.

newsource 2023. 6. 24. 09:15

Git 오류: 포인터여야 하지만 그렇지 않은 7개의 파일이 발견되었습니다.

단계별 파일이 수정된 것으로 표시된 경우 repo를 치료하는 방법은 무엇입니까?

끝나고

git reset --hard

알겠습니다

Encountered 7 file(s) that should have been pointers, but weren't:

중입니다.git clean -fdx도움이 되지도 않습니다.

Travis Heeter가 답변에서 언급한 것처럼 다음 명령 시퀀스를 사용해 보십시오.

git lfs uninstall
git reset --hard
git lfs install
git lfs pull

이것이 작동하지 않는 경우(나에게는 작동하지 않았기 때문에), 다음 해킹이 작동할 수 있습니다.

git rm --cached -r .
git reset --hard
git rm .gitattributes
git reset .
git checkout .

나한테 효과가 있었어요!

git-LFS에 저장된 일부 파일에서 정확한 오류가 발생하여 라이닝 유도 보크 인덱스를 해결한 것과 동일한 방법으로 해결했습니다.

캐시를 지우고 하드 재설정을 수행합니다.

git rm --cached -r .
git reset --hard

레포에 대용량 Git-LFS 파일이 저장되어 있어 새로운 클론보다 훨씬 빨랐습니다.

gitlfs 2.5.0 이후로 사용 가능한 새로운 명령어가 있습니다(docs).

git lfs migrate import --no-rewrite "broken file.jpg" "another broken file.png" ...

.gitfs에 따라 . gitfs는 lfs 단위입니다..gitattributes하지만 현재는 그렇지 않습니다(이것이 오류 메시지의 원인입니다).

--no-rewriteGit는 이를 이전 커밋에 적용하지 못하도록 하고 대신 단일 새 커밋을 만듭니다.

사용하다-m "commitmessage"해당 커밋에 대한 커밋 메시지를 설정합니다.

이 는 이문에서는에제다의니해추발도인 에서 LFS가 추적하는 합니다..gitattributes그리고 일부 일치하는 파일은 이미 기존의 비 LFS 버전 제어 하에 있습니다.

그래서 여기서 가장 간단한 해결책은 단지 그것을 제거하는 것입니다..gitattributes잠시 파일:

git rm .gitattributes
git reset .
git checkout .

나중에 다른 지점을 체크아웃할 수 있습니다.

한 가지 더 조언합니다. LFS에 새 때 git LFS를 ..gitattributes그러나 예를 들어 실행:

git lfs track PATTERN

를 들어, "PATNAL"과 같은 패턴입니다. 예:*.so

이렇게 하면 새 추적 패턴과 일치하는 이미 LFS 버전이 아닌 모든 파일이 더티로 표시되고 단순하게 추가될 수 있습니다. 즉, git LFS(파일 포인터)로 변환할 수 있습니다.

LFS에서 해야 하는 할 때 할 수 ..gitattributesIDE와 .Git GUI 및 IDE와 같은 프로그램이 있습니다.

이러한 파일이 갑자기 나타나 체크아웃을 할 수 없기 때문에 이 문제가 해결되지 않을 수 있습니다.변경사항을 저장하는 즉시 해당 변경사항이 반환됩니다.이러한 상황이 발생할 경우에는 이러한 변경 사항을 임시 지점에서 커밋하여 다시 체크아웃할 수 있도록 하는 것이 빠른 해결책입니다.

이 문제를 진정으로 해결하려면 파일을 LFS 포인터로 커밋했는지 확인하십시오.은 이은사용것간합야니다단해처럼는하를 사용하는 .git add다을사여확작을 사용하여 당신의 git lfs status착수하기 전에 git lfs ls-filesLFS에서 관리 중인 파일이 표시됩니다.

git lfs status그것은 읽기 때문에 오해의 소지가 있습니다.Git LFS objects to be committed모든 변경 사항이 나열됩니다.에 의해 은 LFS와 같은 것을 읽어야 합니다.(LFS: c9e4f4a)또는(Git: c9e4f4a -> LFS: c9e4f4a)그리고 아닌(Git: c9e4f4a).

예를 들어 Xcode 9.2를 통해 이미지 자산을 추가할 때 이 문제가 발생한다는 것을 알게 되었고, 여기서 "CalendarChecked.png"을 자동으로 추가했습니다.

$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png

$ git lfs status

Git LFS objects to be committed:

    Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (Git: c9e4f4a)

Git LFS objects not staged for commit:

    Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (File: c9e4f4a)

$ git add Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png`
$ git lfs status

Git LFS objects to be committed:

    Empty/Empty/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (LFS: c9e4f4a)

Git LFS objects not staged for commit:

$

이 두 가지 해결책 모두 저에게는 효과가 없었습니다. 하지만 저는 이 모든 것을 해결하기 위해 몇 가지 소스를 조합했습니다.

  1. 손실하지 않을 변경사항 푸시

    할 수만 있다면...그렇지 않은 경우 또는 변경 내용에 관심이 없는 경우 를 누릅니다.

  2. 모두 중지

    소스 트리, 모든 서버, 파일 탐색기 및 브라우저.다른 곳에서 사용하는 경우 이 제품이 작동하지 않을 수도 있습니다.의심스러울 때는 그만두세요. 이것으로 과잉 살상을 하는 것이 좋습니다.

    관리자로 하여 임의의 작업을 종료합니다bash.exe 후에도 파일을 .Git Bash는 창을 닫은 후 파일을 열어두는 경향이 있습니다.

  3. 명령 창(또는 터미널) 열기

    cd당신의 지역 담당자에게.

  4. »lfs

    > git lfs uninstall

    그러면 다음과 같은 내용이 표시됩니다.

    Hooks for this repository have been removed.
    Global Git LFS configuration has been removed.
    
  5. 리셋

    > git reset --hard

    아마 많은 양의 결과물이 나올 겁니다.

  6. 다시 설치lfs

    > git lfs install

    이것은 포인터여야 하지만 그렇지 않은 파일을 찾았다고 다시 말할 수 있습니다.괜찮아요, 계속해요!

  7. 당기기로 lfs

    > git lfs pull

    lfs로 풀링하면 borke된 파일을 덮어쓸 수 있기를 바랍니다.

    제 정보원 중 몇 명은 이 시점에서 그들의 레포가 다시 작동하고 있다고 말했지만, 저는 개인적으로 그렇지 않았습니다.원하신다면 소스 트리 등을 열어 확인할 수 있지만, 작동하지 않으면 처음부터 시작해야 할 수도 있습니다.

  8. 마이그레이션

    여기서 핵심적인 문제는lfs오디오, 비디오, 이미지와 같은 대용량 파일을 다운로드하는 대신 서버에서 해당 파일을 가리킵니다.이 기능은 대용량 파일이 여러 개 있을 때 유용합니다. 이러한 파일을 모두 다운로드하지는 않습니다.따라서 현지 레포는 더 작고 민첩합니다.하지만, 제가 확신할 수 없는 상황에서 포인터가 손상될 수 있습니다.저는 이것이 LFS 사람들이 인식하고 작업하고 있는 문제라고 확신하지만, 지금은 우리가 직접 해결해야 합니다.

    지금까지 우리가 한 일은

    • lfs
    • 모두 삭제
    • lfs
    • 온갖 수단을 다 쓰다

    그래서 이제 우리는 파일 또는 파일에 대한 포인터모든 을 폴더에 가지고 있습니다.lfs파일이 포인터여야 하는지 여부를 파악해야 합니다. 그 반대의 경우도 마찬가지입니다.그리고 위의 단계를 수행함으로써 손상된 포인터를 삭제할 수 있기를 바랍니다.그래서 우리는 공연을 할 것입니다.migrate, 보다 클 합니다.repo 파일은 .repo 파일 1Mb 파일은 lfs 파일입니다.

    > git lfs migrate

  9. 추가 오류

    여기 다른 사람들이 멈추고 다시 일한다고 말한 지점이 있습니다. 하지만 저는 아닙니다.오류가 발생했습니다.

    rev-list...git rev-list 류오...종료 상태 128 치명적: 잘못된 수정본 '...v1.0.0'

    @guneyozsan은 github 도움말 페이지에서 이 마지막 작품을 퍼즐에 올렸습니다. 비록 그것이 그의 문제를 해결하지는 못했지만요.

    > git lfs migrate info --include-ref=v1.0.0

    발생한 하는 버전을 확인하십시오.v1.0.0교체해야 합니다.v1.0.0당신이 실수한 버전이 무엇이든 간에.

    하는 이유에 를 찾지, 제 으로는 이 오류가 발생한 는 이오류가발찾못대, 제로는으 lfs호다니입니다.migrate로컬 레포에 있는 파일이 원본 버전과 일치하지 않습니다.저에게 이 모든 것은 소스 트리가 푸시 도중 충돌하여 기계를 강제로 재부팅했을 때 시작되었습니다. 그러면 LFS는 어떻게 처리해야 하는지를 모르기 때문에 이 루프에서 업데이트를 시도하지만 손상된 데이터를 읽을 수 없습니다.따라서 문제 해결이 길어집니다.

  10. 스택 앤 풀

소스 트리를 열면 모든 파일을 다시 추가하려는 것을 볼 수 있습니다.그러지마세요.숨긴 다음 당겨요.

그리고 쾅, 공포가 끝났으면 좋겠습니다.그렇지 않다면, 이 Git hub 페이지나 이 페이지가 더 도움이 될 수도 있지만, 이것이 저에게 효과가 있었습니다.

계셔야 합니다.git lfs버전 2.5 이상이 설치되었습니다(여기 참조).

합니다.git lfs다운로드한 버전(나의 경우 2.7.2):

>git lfs version
git-lfs/2.7.2

실행:

git lfs migrate import --fixup --everything

분기를 풀링하고 병합 충돌을 해결합니다.

Github 설명에 있습니다.

달려.

git add --renormalize .

그리고 그 변화들을 실행합니다.LFS 포인터는 파일의 해시에서 파생되므로 다른 사용자가 다른 분기에서 동일한 작업을 수행하는 경우에도 안전합니다.또한 잘못된 줄 끝 부분이 있는 일부 파일을 잡을 수도 있습니다.

오류의 한 가지 가능한 원인은 저장소에 이미 추가된 파일에 영향을 미치는 LFS 관련 변경 사항 때문입니다.

(정확한 복제 단계는 모르겠지만 이전에 LFS가 아닌 파일로 커밋된 .git 특성의 영향을 새로 받은 파일을 만졌을 때 문제가 발생한 것 같습니다.지점을 전환함으로써 문제가 악화되거나, 적어도 문제가 해결될 때까지 지점을 전환할 수 없게 된 것으로 보입니다.)

이 경우, 저는 이 오류가 반복적으로 발생하지 않도록 하기 위해 아래 단계를 사용했습니다.


  1. 캐시를 지우고 재설정하는 등의 다른 대답 중 하나를 따라 현재 사용 중인 분기에 대한 문제를 해결합니다.저는 Bhee Ma의 답변이 효과적이라는 것을 알았습니다.
  2. 본사로 이동하여 관련 사항이 없는지 확인합니다.git status
  3. Git 속성 변경 사항을 다시 확인하고 "다시 적용"하도록 Git 강제 적용

.git 속성 변경을 적용하는 방법대한 Ratata Tata의 답변에서)

 git rm --cached -r .
 git add -A

경고: 2단계에서는 커밋할 내용이 없는지 확인하십시오. 위의 단계에서는 이전에 버전이 적용되지 않은 파일이 추가됩니다.

  1. 결과를 합니다.git status(포인터가 시킬 수 ) 및 사항을 수 있는 파일만
  2. 가능하면 이 수정사항을 다른 모든 분기로 병합/베이스 변경합니다.그렇지 않으면 해당 분기로 전환할 때 이 오류가 다시 나타날 수 있습니다.영향을 받는 파일을 커밋하는 것만으로도 괜찮을 수 있지만 1단계에 따라 각 분기에 대한 초기 수정을 반복해야 안전할 수 있습니다.)

이것은 개 더미가 무엇인지를 한 번 더 보여줍니다.

다음과 같은 경우 이 상황에 처할 수 있습니다.

  1. 파일이 다음에 포함되어 있습니다.common-base-branch
  2. 에서 가로지.lfs-branch에 기반을 둔common-base-branch되었습니다.
  3. 지점에서 른다지서에점.non-lfs-branch 또한에여하거에 함.common-base-branch파일이 수정되었습니다.

또는 다음과 같은 방법으로:

  1. 파일이 다음에 포함되어 있지 않습니다.common-base-branch
  2. 에서 가로지.lfs-branch에 기반을 둔common-base-branch되었습니다.
  3. 지점에서 른다지서에점.non-lfs-branch 또한에여하거에 함.common-base-branch파일이 추가되었지만 LFS에는 추가되지 않았습니다.

모두, 이 두우경모병시때도할을을 하려고 할 수 .non-lfs-branch안으로lfs-branch이런 종류의 오류가 발생합니다.

애초에 왜 이런 일이 발생해야 하는지 물을 수도 있지만, 답은 많은 소프트웨어가 한 명 이상의 사람에 의해 개발된다는 것입니다(그래서 애초에 GIT와 같은 버전 제어 시스템을 가지고 있는 것입니다). 그리고 사람들이 항상 서로 대화하는 것은 아닙니다. 또는 LFS는 나중에 기능 분기의 프로젝트 역사에 도입됩니다."정상적인" 개발은 여전히 다른 지점에서 진행되고 있습니다.

이는 합법적인 병합 충돌 상황으로, 버그나 손상된 작업 디렉터리 또는 기타(다른 답변 중 일부에서 알 수 있음)가 아닙니다.GIT-LFS는 이를 제대로 처리하지 못합니다.

충돌된 파일의 올바른 버전이 GIT-LFS에 포함되도록 하는 것이 좋습니다. 따라서 이 질문에 대한 답을 선택하는 것이 좋습니다.(TODO: 작동하는 답변에 대한 링크를 하나 이상)

수락된 답변은 저에게 효과가 있었지만 수동으로 명령을 입력하고 각 명령 사이에 절전 모드를 배치한 후 이제 bash 스크립트로 작동합니다.

git rm --cached -r .
sleep 1
git reset --hard
sleep 1
git rm .gitattributes
sleep 1
git reset .
sleep 1
git checkout .

만약 당신이 그 나쁜 약속에서 벗어나고 싶다면, 당신은 마스터로 돌아갈 수 있습니다.

git reset --soft origin/master
git reset --hard

그러면 당신은 나쁜 7개의 비 LFS 파일로부터 자유로워집니다:-)

위의 @John Kugelman과 동일하지만 여러 번 해야 했기 때문에 가명으로 넣었습니다.

    
git rm --cached -r . > /dev/null && git reset --hard > /dev/null && git rm .gitattributes > /dev/null && git reset . && git checkout . > /dev/null

다음 프로세스는 lfs 포인터여야 하는 모든 이진 파일을 lfs 포인터로 대체하는 커밋을 추가합니다.

  1. 작업 복사본을 완전히 정리합니다.아래의 force add와 함께 .gitignore 패턴으로 인해 파일이 추가되거나 제거되는 것을 방지합니다.

    git clean -dfx
    git reset --hard
    git checkout -- .
    
  2. 준비 영역에 모든 항목에 대한 제거를 추가합니다.작업 복사본은 터치되지 않습니다.

    git rm --cached -r .
    
  3. 작업 복사본에서 모든 파일을 다시 읽었습니다.이렇게 하면 기본적으로 이전 명령이 실행 취소되지만 lfs 필터가 재평가됩니다..gitignore를 무시하려면 -f를 사용합니다.존재하는 모든 파일이 이전에 체크인되었으므로 다시 추가해야 합니다.

    git add -f .
    
  4. 이제 스테이징 영역에는 이전에 ' 포인터여야 함' 오류를 발생시킨 이진 파일만 포함되어야 합니다.

    git commit -m "moved files to lfs"
    

제가 마주친 문제는 다음과 같습니다.

분기를 생성하고 파일을 비 LFS로 커밋했다고 가정합니다.그런 다음 나중에 같은 분기에 있는 파일의 LFS 버전을 커밋하여 수정하려고 했습니다.그러나 이제 기본 재배치 또는 스쿼시를 수행할 수 없습니다. 기본 재배치 도중 "포인터여야 하지만 그렇지 않은 파일" 오류가 계속 발생하기 때문입니다.

다음을 사용하여 해결git reset --soft: https://stackoverflow.com/a/5201642/2516916

제 경우에는 lfs 규칙에 따라 하나의 파일이었습니다(lfs 설치 등 없이 체크인된 것으로 가정합니다).

그래서 저는 .git 특성 파일에서 확장자를 찾았고 이 줄을 다음과 같이 설명했습니다.

#*.7z filter=lfs diff=lfs merge=lfs -text

한 다음 .git 파일을 저장합니다.git status문제가 없었습니다.

) ..git 속성을 했습니다.git status여전히 문제가 없습니다.

분석.

이는 파일이 LFS에 의해 추적되지 않지만 일부 .git 특성 파일의 설명과 일치하기 때문입니다.

예를들면,

server/.git 특성:

conf/** filter=lfs diff=lfs merge=lfs -text
  • server/conf/client.conf가 너무 커서 LFS에 의해 추적됩니다.
  • LFS 대신 server/conf/client.gflags가 추적됩니다.

그러나 client.gflags가 server/.git 특성 설명과 일치하고 git가 LFS에서 끌어오지만 LFS 정보가 없으므로 오류가 표시됩니다.

해결책

이 .git와 .Encoutered file잘못된 설명을 삭제하거나 일부 와일드카드 문자 일치를 최적화합니다.

위의 예제 server/.git 특성을 최적화합니다.

conf/client.conf filter=lfs diff=lfs merge=lfs -text

전체 레포를 건드리지 않고 제게 도움이 된 것은git restore 2.23git 2.23에 입니다.

git restore --source=HEAD --staged --worktree -- affected_files

모든 경고가 사라질 때까지 이 명령을 몇 번 실행합니다.

karyon의 답변 외에도 마이그레이션을 수행하여 로컬 상태를 수정한 후:

git lfs migrate import --no-rewrite "broken file.jpg" "another broken file.png" ...

당신은 아마도 없애고 싶은 여분의 약속이 있습니다.

.git 특성이 주/마스터 분기에 이미 고정되어 있다는 점을 고려하면 로컬 분기를 일반적으로 다음과 같은 수정 사항이 포함된 분기로 재배치할 수 있습니다.

git rebase upstream/master

그리고 이 추가 커밋은 이 시점에서 의미가 없으므로 자동으로 삭제됩니다.

갑자기 나타나는 오류일 경우, 우리 팀은 다음과 같이 처리합니다.

  1. 해당 유형 파일에 대해 lfs 사용 안 함(.git 특성 수정 또는 소스 트리 메뉴를 통해)

  2. 변경 사항은 사라지고 대신 .git 특성에 대한 변경 사항이 표시됩니다.

  3. 문제를 제거합니다.

    3.1 한 가지 해결책은 git reset --hard를 실행하는 것입니다.다른 방법으로, 변경사항을 삭제합니다.파일이 다시 나타나지 않을 수 있습니다.

    3.2.1 이전 용액이 작동하지 않을 경우 1과 2를 반복합니다.그런 다음 현재(A)에 있는 이 지점이 이미 해당 성가신 파일을 제외한 모든 것을 커밋하고 푸시했는지 확인합니다.그런 다음 거스름돈은 커밋하되 밀지는 마십시오.

    3.2.2: 다른 지점으로 이동(B)

    3.2.3: .git 속성에 대한 커밋을 수행한 로컬 분기(A)를 제거하여 푸시되지 않은 커밋이 있다고 표시되는 경우에도 강제로 제거합니다.커밋을 잊어버립니다(이후 GC 등을 통해 제거할 수 있지만 오류가 있는 파일이 크지 않으면 큰 문제가 아닙니다).

    3.2.4: 지점 A를 다시 확인합니다.성가신 파일 및 LFS 설정이 올바른 방법으로 설정되지 않은 채 저장소의 이전 상태를 다운로드합니다.

그것은 항상 효과가 있습니다!

위의 명령 중 어떤 것도 저에게 효과가 없었습니다. 저는 여기서 을 찾았습니다.

git status -s | cut -c 4- | xargs git update-index --assume-unchanged
rm .git/index && git reset

해결해야 할 단계가 여러 개 있는 이 문제에 대한 답변이 많습니다.

내용을 재설정/수 된 것과 에 있는 : 합니다..gitattributes다음 Git 이동을 허용하기에 파일이 충분할 수 있습니다. Move를 에는 Git Move를 할 수도 ..gitattributes파일을 작성하지만 적어도 당신은 안전합니다.

위의 모든 것을 시도하기 전에 이 사실을 알았더라면 좋았을 것입니다.최소한 시도하는 것은 위험이 낮은 옵션입니다.

설치하거나 LFS를 가 없는 이이 있습니다..gitattributes삭제된 파일:

git -c filter.lfs.smudge= -c filter.lfs.clean= reset --hard

언급URL : https://stackoverflow.com/questions/46704572/git-error-encountered-7-files-that-should-have-been-pointers-but-werent