일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Blog
- 재테크
- 클라우드
- SaaS
- 무민
- 근로소득
- 카카오프렌즈
- cloud
- 총급여세액
- paas
- 취미
- 인형뽑기
- ppt
- network
- Excel
- gil
- 꾸미기
- 파워포인트
- 네트워크
- MultiThreading
- 인형
- 연말정산
- 포켓몬스터
- iaas
- 세금
- 근로소득공제
- lan
- threading
- 금융
- PowerPoint
- Today
- Total
쿠키의 저장소
how to clone all remote branches to local branches in git 본문
안녕하세요. 오늘 공유할 정보는 깃 사용할 때의 팁입니다. 웬만한 경우에는 이런 일이 필요없을 수 있지만 remote 저장소에 있는 모든 branch를 local 저장소에 가져와야할 필요가 있을 때가 있습니다. (사실 제가 필요했습니다...)
거의 100여개에 가까운 branch를 branch -r로 목록 보고 일일히 체크아웃해서 가져오기는 너무 힘들죠... 생각만해도 끔찍했습니다. 그래서 열심히 찾아보고 지인들에게 물어보아 다음의 포스팅을 찾게 되었습니다. (진리의 StackOverFlow https://stackoverflow.com/questions/67699/how-to-clone-all-remote-branches-in-git)
해당 스레드에서 제가 사용한 방법은
git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master ;
위의 명령어를 git bash에서 실행하는 것입니다.
git checkout master ; remote=origin ; for brname in ` git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}' `; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ;
git checkout master ;
좀 더 이해하기 쉽도록 적자면 두번째 박스처럼 표현할 수 있습니다.
다만 유의할 점이 몇 가지가 있는데
첫 번째로 절대로 git bash 상에서 두 번째 박스를 복사해서 실행하시면 안되고 첫번째 박스(한 줄로 된 명령어)를 복사해서 실행하셔야한다는 점입니다. 제가 이걸 모르고 두 번째 박스를 사용했다가 한참 헤맸습니다...
두 번째로 git bash 상에서는 대소문자를 구분하지 않는다는 점입니다. 만약 example이라는 브랜치와 EXample이라는 브랜치가 존재한다면 git bash 상에서는 이 두 브랜치가 같은 것으로 인식됩니다. 따라서 git branch -D 구문에서 EXample 브랜치에 대한 삭제 명령이 실행될 때 로컬에 이미 example 브랜치가 존재한다면 example 브랜치가 삭제될 수도 있습니다. 이를 염두에 두셔서 브랜치명을 대소문자만 다르게 생성하시는 일은 지양하시면 좋겠습니다.
위의 명령어를 대략적으로 설명해드린다면
1. master로 checkout을 하고
2. remote를 origin으로 설정한 후 ex) origin/exampleBranch (만약 remote의 prefix가 origin이 아닌 다른 것이라면 수정해주시면 됩니다.)
3. git branch -r | grep $remote | grep -v master | grep -v HEAD 구문에서 git branch -r은 remote의 브랜치 목록을 출력하는 명령어인데 그 중 remote prefix가 붙은 것만 grep을 하고, 그 중에서 master와 HEAD 브랜치는 제외하여 가져온다는 의미입니다.
4. awk '{gsub~~~~~~~~~}' 이 부분은 정확히 보지는 않았지만 3번에서 가져온 텍스트 중에서 정확히 branch명만을 뽑아내기 위한 구문인듯 합니다.
5. 그렇게 뽑아낸 $brname 브랜치가 로컬에 이미 존재할 수도 있으니 branch -D 명령어로 이미 존재하는 브랜치를 지워주고
6. checkout -b 명령어로 해당 $remote/$brname 브랜치로 checkout하여 로컬에 $brname의 이름을 갖는 로컬 브랜치를 생성합니다.
7. 그렇게 for ~ in ~ 구문으로 모든 브랜치에 다 돌면서 위의 3~6을 반복하고 마지막으로 다시 master로 checkout하고 끝냅니다.
사실 그냥 명령어를 복붙해서 실행하시면 알아서 잘 돌아가기 때문에 위의 프로세스를 굳이 이해하지 않으셔도 괜찮습니다. 다만 저는 삽질을 좀 했기 때문에... 강제로 저 위의 프로세스를 이해해야만 했었고... 사실 이해하는게 다음에 다른 일이 생길 때 응용하기 더 좋기야 하겠죠 ㅎㅎ
위의 내용 중 잘못된 것이 있다면 댓글로 남겨주시면 확인 후 수정하도록 하겠습니다.
혹은 제가 적지 못한 내용 중에 알아야할 부분 혹은 알면 좋을 부분에 대한 설명을 댓글에 남겨주시면 확인 후 추가하도록 하겠습니다.