--prune - 원격저장소에서 삭제한 브랜치를 로컬에서도 한꺼번에 가지치기하고 싶어요

김동규·2023년 4월 30일
0

Git

목록 보기
14/15

원격저장소에서 삭제된 브랜치 로컬에 업데이트하기

github, gitlab과 같은 원격저장소에서는 머지가 끝난 브랜치를 자동으로 삭제하도록 설정하기도 합니다.

그러나 로컬에서 ref로 참조하고 있는 포인터들은 원격저장소의 그것과는 별도이기 때문에 사라지지 않습니다.

시험삼아 github의 rebase브랜치를 삭제해보겠습니다. git branch --all명령을 사용해보면 다음과 같은 그림이 표시될 겁니다.

rebase는 로컬브랜치이니 당연히 남아있지만, remotes/origin/rebase가 남아있습니다. 지금은 우선 원격저장소의 브랜치 삭제부터 반영해봅시다.

git fetch -p
/* 또는 */
git remote prune origin
git remote update --prune

둘은 같은 명령이 아닙니다.

  • git fetch -p는 fetch의 옵션이기 때문에, 먼저 원격저장소의 모든 변경사항을 받아온 뒤 가지치기를 진행합니다.
  • git remote prune origin은 변경사항을 확인하고 받아오지 않으면서 가지치기만 진행합니다.

이제 git branch -vv를 통해 각각의 브랜치에서 upstream이 사라졌는지 확인할 수 있습니다.

로컬 rebase브랜치에서 가리킬 remotes/origin/rebase브랜치가 사라졌기 때문에 : gone으로 표시되고 있습니다.

업데이트된 [:gone]을 바탕으로 로컬브랜치 가지치기

추가참고 : 10 Must Know Git Commands That Almost Nobody Knows

remote브랜치가 삭제된 로컬브랜치를 정리하기 위해서는 약간의 쉘 스크립트를 사용할 필요가 있습니다.

git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d

해설해보자면 이렇습니다.

  1. git branch -vv명령어의 output을 파이프라인으로 awk의 input으로 전달
  2. awk를 통해 input중 ': gone]'이 포함된 브랜치 목록을 획득, xargs에 전달
  3. xargs에서 전달받은 브랜치 이름들에 git branch -d 적용

로컬브랜치를 정리하는데에는 다른 명령들을 사용해도 무방합니다. 다만 조건에 주의해주세요.

단순히 upstream이 없는 브랜치를 삭제하도록 명령하면 로컬에 생성했지만 아직 원격저장소와 연결되지 않은 브랜치도 함께 삭제될 겁니다. 이 명령어는 : gone]이 포함된 것만 삭제하기 때문에 그럴 우려가 없습니다.

profile
공식문서를 사랑하는 프론트엔드 주니어 개발자

0개의 댓글