본문 바로가기
Linux & GIT

git fetch --prune 명령

by 누워서 코딩 2021. 11. 17.

git pull 과정에서 다음처럼 'ref lock' 에러가 발생하는 경우가 있습니다.

error: cannot lock ref ‘refs/remotes/origin/{branch_name}’: ‘refs/remotes/origin/{branch_prefix}’ exists; cannot create ‘refs/remotes/origin/{branch_name}’

 

원인은 unreachable(도달할 수 없는) git object들이 원인인데, 이때 unreachable이란 git tree상에 참조되지 않는 gc(garbage collection)의 대상이 되는 dangling refs(매달린 참조들)입니다.

 

해결 방법은 이렇게 git tree상의 참조되지 않은 git object인 gc들을 'local'에서 clean 하는 작업이 필요합니다.

이때 직접적으로 수행하는 방법은 'git gc' 명령어입니다. 그리고 간접적으로 수행하는 방법이 여기서 다룰 'git fetch --prune' 명령어입니다.

 

 

prune의 사전적인 의미는 '치다'라는 의미로 즉 Branch의 가지를 친다는 의미로 해석할 수 있습니다.

 

다음처럼 명령을 실행하면 remote에 존재하지 않는 refs를 지워버린 후, fetch나 pull을 수행하게 됩니다.

여기서 중요한 점은 remote의 refs를 바로 지우는 것이 아니라, local에서 remote를 ref 하는 것들 중 유효하지 않은 것만 제거하는 작업입니다. 

$git fetch --prune

 

여기에 확장으로 '--tags' 나 'force'와 같은 옵션들을 주면, 강제로 local에서 remote의 유효하지 않은 tag도 함께 제거할 수 있습니다.

 

git fetch --all --prune --tags -force

댓글