티스토리 뷰

728x90
반응형

[ 단축어 만들고 싶은 이유 ]

 

깃헙 > Setting > Options에 보면

머지될 때 해당 브랜치를 지워주는 기능을 설정할 수 있습니다.

 

 

이는 원격 브랜치를 지워주는 기능으로

로컬 브랜치는 알아서 지워줘야합니다. 

 

 

머지된 로컬 브랜치를 파악해서 스스로 지워주는 일이 귀찮을 때,

머지된 로컬 브랜치를 전부 지워주는 git 명령어를 쓸 수 있습니다. (새로운 로컬브랜치나 아직 머지되지 않은 로컬브랜치는 안지움)

 

develop에 머지된 로컬 브랜치들을 삭제해주는 명령어입니다.  (참고: local/remote/merged 브랜치 목록 조회 명령어)

git branch -d $(git branch --merge develop | grep -i -v -E "master|develop")

 

주기적으로 이 명령어를 돌릴 수 있는

crontab을 적용하기도 귀찮고,,,하여

가장 간단한 단축어로 만들어보기로 합니다.

 

 

 

[ 스크립트 만들기 ] 

 

우선 스크립트를 만들어주겠습니다.

파일명은 delete-local-branch-already-merged-into-develop.py 로 하였습니다. 

 

 

 

 

 

코드 설명은 아래와 같습니다. 

 

## 1.

 

git_repo_directory_list에 이 스크립트를 적용할 깃헙 레포의 디렉토리 들을 넣어줍니다. 

git_repo_directory_list = [
    '~~~~/MyApp1',
    '~~~~/MyApp2'
]

 

 

## 2.

 

os.chdir로 해당 디렉토리로 이동합니다.

 

 

## 3.

os.system('git checkout develop')
os.system('git pull')

develop으로 체크아웃하고 pull 받습니다. 

 

 

## 4. 

 

아래의 문법으로 명령어를 쳐서 출력되는 output을 변수에 담을 수 있습니다. 

variable = os.popen('커맨드 명령어').read()

 

이렇게 하고 출력해보면 (참고: grep 명령어)

merged_branch_list = os.popen('git branch --merge develop | grep -i -v -E "master|develop"').read()
print(merged_branch_list)

 

아래와 같이 앞에 space가 좀 있는 채로 목록이 출력됩니다. 

 

 

더 명확하게 보고 싶으면 line별로 나눠서 list를 만들어주는 .splitlines() 을 적용해서 확인해봐도 됩니다.

merged_branch_list = os.popen('git branch --merge develop | grep -i -v -E "master|develop"').read()
print(merged_branch_list.splitlines())

 

 

그러므로 자동으로 \n 과 space에 따라 split하여 list를 만들어주는 split()을 적용해줍니다. 

merged_branch_list = os.popen('git branch --merge develop | grep -i -v -E "master|develop"').read().split()
print(merged_branch_list)

 

## 5.

 

위에서 구한 리스트를 string으로 join해줍니다. 

merged_branch_list_str = " ".join(merged_branch_list)
print(merged_branch_list_str)

 

 

## 6.

 

머지된 브랜치가 없을 때 merged_branch_list가 empty여서 merged_branch_list_str은 empty string입니다.

git branch -d 명령어는 뒤에 브랜치를 안적어주면 아래와 같은 에러를 일으킵니다. 

 

"fatal: branch name required"

 

 

그러므로 emtpy 일 때는 해당 명령어가 실행되지 않도록 해줍니다. 

if len(merged_branch_list) == 0:
    continue

 

## 7.

 

마지막으로 브랜치 삭제 명령어를 실행시켜주면 끝!

os.system('git branch -d %s' % merged_branch_list_str)

 

 

[ 단축어 만들기 ] 

 

Automator 앱을 열고 빠른 동작을 선택해줍니다. 

 

 

 

작업흐름 수신을 입력없음으로 설정해주고

셀 스크립트 실행을 추가해줍니다.

그리고 python이라고 쳐줍니다. 

 

 

스크립트 파일을 끌어오면 path가 입력됩니다. (당연히 path를 직접 타이핑 해줘도 됩니다..!)

 

 

이렇게 단축어를 완성했습니다!

 

 

이제 Command + S 눌러서 저장해줍니다.

동작이름은 Delete Local Branch Merged Into Develop로 해줬습니다. 

 

 

여기 저장되었습니다..! 

 

 

 

[ 단축어 Finder에 등록하기 ] 

 

설정 > 키보드 > 단축키에 들어가주세요

아까 만들었던 단축어가 있습니다. 

 

 

control 키 누르고 선택해주면 

목록이 나옵니다. 

여기서 'Finder에서 보기' 를 눌러줍니다. 

 

 

잘 추가되었습니다..! 

 

 

 

[  Finder 접근 권한 설정 ]

 

서비스에 추가된 단축어를 실행시켜보면 에러 팝업이 뜹니다. 

 

can't open file '/Users/kakao/Desktop/delete-local-branch-already-merged-into-develop.py':

[Errno 1] Operation not permitted’

 

 

How to Fix Automator's "Operation Not Permitted" Error in macOS Catalina 글을  보고 따라해줍니다.

 

 

설정 > 보안 및 개인 정보 보호 > 전체 디스크 접근권한 에 들어가서 

 

 

+ 누르고 Finder를 선택

 

 

여기 Finder가 추가되었는 지 확인

 

 

 

이제 다시 단축어를 실행해보면 에러안나고 잘되는 것을 확인할 수 있습니다!

 

 

 

 

-----------------

base 를 세팅하고 싶을 때 스크립트

import os

git_repo_directory_list = [
    ... 
]

base = "release/v5.0.0"  # "develop"

for directory in git_repo_directory_list:
    os.chdir(directory)
    os.system(f'git checkout {base}')
    os.system('git pull')

    merged_branch_list = os.popen(f'git branch --merged | grep -v {base} | grep -v "develop" | grep -v "master"').read().split()
    merged_branch_list_str = " ".join(merged_branch_list)

    if len(merged_branch_list) == 0:
        continue

    os.system(f'git branch -d {merged_branch_list_str}')

 

반응형
댓글