2011-08-29 5 views
23

Git 저장소에 Gerrit를 사용하고 있습니다. 몇 달 동안 활동해온 프로젝트에서 갑자기 변경 사항을 적용 할 수 없습니다.Git 저장소에서 "누락 된 트리"오류를 복구하려면 어떻게해야합니까?

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

git fsck --full 수율을 실행 : 우리가 git push을 실행할 때 우리는 다음과 같은 오류가 표시가 밀어하려고 할 때

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a 
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27 
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff 
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2 
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f 
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df 
dangling tree 5377d7f7111d340854c3ee0946667c202227e603 
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1 
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819 
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94 
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d 

우리의 모든 개발자가 동일한 오류를 경험하고 있습니다. 지금까지 우리는 gerrit repo (git init --bare ...)를 다시 초기화하고 그 위로 밀어 넣으려고했습니다. 또한 별도의 repo로 새로운 gerrit 프로젝트를 만들려고했습니다. 결국 같은 오류가 계속 발생합니다.

누군가가 원인이나 복구 방법에 대해 통찰력을 갖고 있습니까?

답변

7

백업 ... 아무 것도 시도하기 전에 바로 백업 해 두십시오.

이제는 불행합니다. 정기적으로 백업을해야하는 것처럼 들리지 않는 것은 부끄러운 일입니다. 좋은 소식이 있습니다. : 비록 당신의 개발자들이이 파일을 가지고 있을지 모르지만 그것은 팩 파일일지도 모릅니다. 다른 사람의 .git 디렉토리에서 다음을 시도하십시오. git은 디렉터리 이름에 해시의 처음 두 문자를 사용합니다.

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9 

그 표시되는 경우, 서버의 같은 상대 경로에 해당 파일을 복사하고 생활이 잘 이동합니다. (신속 스크립트이를하거나 수동으로 할)

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9 

은 즉, 그것이 파일 팩을 표시하지 않습니다, 그러나 그것이 당신에게 말할 것이다 : 그렇지 않으면,이 시도. 올바른 팩 파일을 찾아서 확장하십시오.

거기에서 파일을 서버의 동일한 상대 경로로 복사하십시오. 그렇게해도 해결되지 않으면 추가 작업이 필요합니다. 개발자의 최신 저장소를 스와핑하면 문제가 해결 될 수 있습니다. https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F을 탐색하거나 업데이트 설명을 게시하고이 문제를 다시 해결할 때까지 기다려야 할 수도 있습니다.

+0

정보를 제공해 주셔서 감사합니다. 올바른 idx 파일을 찾을 수 있었지만 pack 파일의 압축을 풀어도 아무 것도 복구하지 못했습니다. 다른 개발자들도 마찬가지였습니다. 결국에는 시간이 없어서 새로운 repo를 초기화하고 이전 repo를 역사에 남겨 두어 문제를 처리했습니다. –

+0

트리 오류가 누락되어 특정 분기를 푸시 할 수없는 비슷한 문제가 있습니다. 누락 된 개체를 찾아 원격 저장소에 복사했지만 문제가 지속됩니다. 모든 단서? –

3

보십시오 git pull --rebase.

diff (git show > ~/mychanges.txt, 파일 맨 위의 커밋 메시지를 꺼 냈습니다.)를 저장했습니다. 체크 아웃 된 새 지점 (git checkout -b newbranch)은 변경 내용 (git apply ~/mychanges.txt)을 적용한 다음 git pull --rebase을 수행했습니다. 그런 다음 모든 것이 효과가있었습니다.

+1

내 하루를 저장해 주셔서 감사합니다! – simonso

0

기술적으로는이 답변이 조금 늦었습니다.하지만 제가 시도한 변경 집합에 대한 패치를 만들어서 저장소를 다른 디스크 위치에 다시 적용하고, 패치를 적용하고, 다시 시작하고, 밀어 넣었습니다.

0

빠른 해결책은 가져 오기 -> Rebase-> 완료 후 푸시.

3

마스터 분기에, 당신은 단순히하여 원격 지점을 삭제할 수없는 경우

git push --delete origin <branch_name> 

그리고 원격으로 다시 분기를 밀어 :

git push -u origin <branch_name> 
11

나는이 같은 오류에 무엇입니까 내 tortiuse 자식. 마침내이 오류의 근본 원인을 얻었습니다.

이 오류의 원인이되는 단계는 다음과 같습니다.

  • 머리에 새 분기를 만듭니다.
  • 은 지점을 밀어
  • 누군가는 머리 분기에 수정을 새 branchs에
  • 시도를 일부 수정 작업을 수행

로컬 브랜치가 생성되고 일부 수정 아라 때까지 해제하지 않으면이 오류가 발생합니다 머리 지점에서 만든. 원격 헤드 브랜치는 푸시 조치가있을 때까지 로컬 브랜치에 대해 알지 못하므로 정상적인 현상입니다.

이 오류를 해결하려면 헤드 브랜치를 전환하여 완전히 잡아 당깁니다. 그런 다음 지점을 전환하고 밀어 넣으십시오.

+0

와우는 완전히 비 명백한 원인입니다. 이 솔루션은 나를 위해 일했습니다! –

29

git push 대신 git push --no-thin을 사용하십시오. 힘내 문서에서

:

A thin transfer significantly reduces the amount of sent data when the sender and receiver share many of the same objects in common. The default is --thin.

+3

분기가 많은 커밋보다 많으면이 옵션을 사용할 수 있습니다. 잘 작동합니다! – Riverside

1

가 자식의 버전을 업그레이드하십시오, 우리는 우리가 얻을 때, 나는 거의 항상 자식 GC로 문제를 해결할 수 1.9.0

3

문제를 보았다 :

git gc --aggressive --prune=now 

먼저 git repo를 백업하십시오.

1

일반적으로 커밋 및 푸시 시간이 다르며 결국 두 트리간에 불일치가 발생하는 경우에 발생합니다. 그런 다음 사용하여 원격 지점을 추적

git reset --hard foo 

를 사용

은 첫째로 던져 모든 커밋되지 않은 변경 원격 지점 상류 지역 지점 foo는 주어진

git branch --set-upstream-to=upstream/foo 

그리고 마지막으로

git pull 
관련 문제