Git-Flow 브랜치 전략에 따르면 보통 한 기능에 대해서 최소 하나의 브랜치를 생성하여 작업을 진행할 거예요. 그런데 작업이 진행될수록 점점 늘어나는 브랜치들 여러분들은 어떻게 정리하고 있으신가요?
원격 저장소에 올라간 브랜치들은 브랜치들은 PR이 머지되는 시점에 정리하면 되지만 로컬 브랜치는 협업을 같이하는 팀원들 모두 해당 브랜치가 존재할 수 있기 때문에 모두가 수동으로 지워줘야 하는 번거로움이 있어요.
삭제된 원격 브랜치 추적하기
$ git for-each-ref --format '%(refname) %(upstream:track)'
refs/heads/feature/133/ga
refs/heads/feature/minji/182-notify-message [gone]
refs/remotes/origin/pr_test
refs/tags/1.0.6
refs/tags/v1.0.6
git for-each-ref 명령어를 사용해 Git 저장소의 원하는 정보들을 나열할 수 있어요. git ref는 커밋 로그, 브랜치 등의 References 정보입니다. --format 명령어를 통해 출력 형식을 변경할 수 있어요!
$ git for-each-ref --format '%(refname) %(upstream:track)' refs/heads
refs/heads/feature/133/ga
refs/heads/feature/minji/182-notify-message [gone]
위에 보면 refs/remotes 시작하는 원격 저장소에 있는 브랜치들의 정보와 refs/tags로 시작하는 tag 정보들이 나열된 것을 확인할 수 있었어요. 우리는 로컬 브랜치에 대한 정보만 필요하므로 refs/heads로 필터링을 해주면 좋아요
$ git for-each-ref --format '%(refname:short) %(upstream:track)' refs/heads
feature/133/ga
feature/minji/182-notify-message [gone]
refs/heads로 필터링했기 때문에 출력 형식에 refs/heads는 빼도 될 것 같아요. refname:short를 통해 브랜치 이름만 출력하도록 변경했습니다 :)
$ git for-each-ref --format '%(refname:short) %(upstream:track)' refs/heads |
>> awk '$2 ~ \"gone\" {print $1}'
feature/minji/182-notify-message
터미널 명령어 awk를 사용해서 원격 브랜치에서 삭제된 브랜치들만 표시해야 해요. awk는 문자열에 대해서 여러 다양한 처리를 제공해 줍니다. awk에 대한 설명은 이 주제와 맞지 않기 때문에 awk 문법에 대한 링크를 남길게요
Q. git branch -v 명령어를 사용하면 안되나요?
git branch -v 명령어를 사용하게 되면 브랜치의 정보들을 비슷하게 나열할 수 있어요. 하지만 우리가 앞으로 만들어갈 명령어는 출력 형식 내에서 특정 부분의 정보를 가져와야 해요. 따라서 출력 형식이 달라지면 명령어가 제대로 작동하지 않을 수 있어요. 그런데 git branch 명령어는 다음과 같은 이유가 있어 사용하지 않았아요.
추적한 브랜치 삭제하기
$ git for-each-ref --format '%(refname:short) %(upstream:track)' refs/heads |
awk '$2 ~ \"gone\" {print $1}' | xargs -r git branch -D
Deleted branch feature/minji/182-notify-message (was 5f11887).
최종적으로 xargs 터미널 명령어를 통해 추적한 브랜치들을 삭제해 주면 됩니다 :)
하하 이제는 필요 없는 브랜치들을 하나하나 지워줄 필요가 없겠어요. 하지만 명령어가 길고 복잡해서 간단히 사용하기는 쉽지 않을 것 같아요. 그래서 git 명령어로 만들어주려고 해요.
Git 명령어로 등록하기
$ git config --global edit
...
[alias]
gone = ! git fetch -p && git for-each-ref --format '%(refname:short) %(upstream:track)' | awk '$2 ~ \"gone\" {print $1}' | xargs -r git branch -D
$ git gone
git config --global 파일 내부에 gone이라는 명칭으로 명령어를 등록해주었어요. 앞으로 git gone이라고 쓰면 삭제된 로컬 브랜치들을 정리할 수 있어요!
+ 추가로.. 이 명령어를 통해 확실히 추적된 브랜치들은 제거할 수 있었지만 추적이 안되는 브랜치들도 많더라고요. 그 이유를 아시는 분들은 댓글에 남겨주시면 감사하겠습니다
'GIT' 카테고리의 다른 글
[GIT] continuous integration - Github Action (0) | 2021.02.21 |
---|---|
[GIT] GitHub PR 템플릿, Issue 템플릿 만들기 (0) | 2021.02.15 |
[GIT] 나의 Github 프로필 방문자 수는 몇명일까? (3) | 2021.02.12 |
[GIT] Token authentication (1) | 2021.01.22 |
[Git] 다른사람 Repository에 Pull Request 보내기 (2) | 2020.08.28 |