• All Objects
    • Life
    • Technic
    • entry
  • Tags
  • wsl2
  • docker
  • go
  • git
  • github
Technic

[Git] nullSha1:contains entries pointing to null sha1

2020. 8. 11. 00:03

사용 중인 원격리파지토리를 바꾸기 위해, 기존에 사용 중인 원격리파지토리에서 클론을 받은 후 이사갈 원격 리파지토리에 Push 하려는데, null sha1을 가리키고 있다는 에러를 만났습니다. 

 

$ git push origin2 --all
Enumerating objects: 3141, done.
Counting objects: 100%(3141/3141), done.
Delta compression using up to 12 threads
Compressing objects: 100% (1207/1207), done.
remote: error: object 65465...54654654:nullSha1: contains entries pointing to null sha1
remote: fatal: fsck error in packed object
fatal: sha1 file '<stdout>' write error: Broken pipe
error: remote unpack failed: index-pack abnormal exit
To git.co.kr:org/repo.git
![remote rejected]master -> master(failed)
error:failed to push some refs to 'git@git.co.kr:org/repo.git'

 

에러 메시지를 보니, git object가 비어있는 공간을 가리키고 있다는 것 같은데... 자세한 원인을 찾기 전에, 클론 받은 리파지토리 상태부터 살펴봤습니다. 

 

$ git fsck
Checking object directories: 100%(256/256), done.
warning in tree 9874632 : nullSha1: contains entries pointing to null sha1
warning in tree 3354981 : nullSha1: contains entries pointing to null sha1
warning in tree a215673 : nullSha1: contains entries pointing to null sha1
warning in tree cd5gw6a : nullSha1: contains entries pointing to null sha1

한개도 아니고 4개가 저런 상태였습니다. 스택오버플로우에 "contains entries pointing to null sha1"으로 검색해보니, 서브모듈이 잘못되었을 때 발생하는 경우라는 답변이 많은데, 제가 클론 받은 리파지토리에는 .gitmodule이 없어서 그건 제외하고 다른 원인이 없나 찾아보기 시작했습니다. 그렇게 시간이 흘러가는 중 원작자와 연락이 닿았는데, 예전에 submodule을 사용하다가, 현재는 사용하지 않기에 삭제했다는 얘기를 들었습니다. 

 

그래서 원인을 submodule 사용할 때, 혹은 삭제할 때 뭔가 잘못되었구나 판단하고, 해결 방안을 찾아봤습니다. 

 

해결방법은 ls-tree로 해당 오브젝트를 조회했을 때, 오브젝트가 어떻게 참조되고 있는지에 달려있는 것 같습니다. 여러가지 답변들이 있는데, 가장 확실해 보이는 방법은 다음과 같습니다. 해당 오브젝트를 리파지토리에서 삭제하는 것인데, 

filter-branch를 이용하는 것입니다. 예를 들어 다음과 같이 해당 파일을 tree에서 삭제하는 것입니다. 

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch 'PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA'  --prune-empty --tag-name-filter cat -- --all

정상적으로 삭제된다면, null을 가리키는 오브젝트는 사라지게되고 정상적으로 푸시를 할 수 있습니다. 단, 이 경우 commit history를 다시 기록하게 되는 것이므로, 리파지토리를 같이 사용하는 동료들에게 내용을 전달하고 모두가 새로 클론을 받은 후에 진행하여야 혼선이 생기지 않게 됩니다. 

 

 

참고 : https://docs.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository#using-filter-branch

        https://stackoverflow.com/questions/24183847/how-to-remove-an-entry-with-null-sha1-in-a-git-tree

        https://stackoverflow.com/questions/30512130/how-to-fix-corrupted-git-repository-git-fsck-reports-warning-in-tree-hash

        https://stackoverflow.com/questions/43132265/git-nullsha1-contains-entries-pointing-to-null-sha1

반응형
copyright 2020. noname

티스토리툴바