단일 원격 지점을 로컬 지점으로 추적하는 것은 간단합니다.
$ git checkout --track -b ${branch_name} origin/${branch_name}
모든 로컬 브랜치를 원격으로 푸시하고 필요에 따라 새 원격 브랜치를 생성하는 것도 쉽습니다.
$ git push --all origin
나는 반대로하고 싶다. 단일 소스에 X 개의 원격 분기가있는 경우 :
$ git branch -r
branch1
branch2
branch3
.
.
.
각 원격 지점을 수동으로 만들 필요없이 모든 원격 지점에 대해 로컬 추적 지점을 만들 수 있습니까? 다음과 같이 말하십시오 :
$ git checkout --track -b --all origin
나는 구글과 RTM을 봤지만 지금까지 이단했다.
답변
bash 사용 :
자식 1.9.1 이후
for i in `git branch -a | grep remote | grep -v HEAD | grep -v master`; do git branch --track ${i#remotes/origin/} $i; done
크레딧 : Val Blant, elias 및 Hugo
자식 1.9.1 이전
참고 : 이후 버전의 git (> v1.9.1) 버전에서 사용되는 경우 다음 코드는
- (버그) 마스터를 추적하기 위해 생성 된 모든 브랜치
- (불쾌) 접두사가 붙일 모든 작성된 로컬 브랜치 이름
origin/
for remote in `git branch -r `; do git branch --track $remote; done
로컬 추적 분기에 변경 사항이 없다고 가정하고 분기를 업데이트하십시오.
for remote in `git branch -r `; do git checkout $remote ; git pull; done
모호한 참조 이름 경고를 무시하십시오 .git은 로컬 브랜치를 선호하는 것처럼 보입니다.
답변
오토 (Otto)의 답변은 훌륭하지만, 생성 된 모든 브랜치는 이름의 시작으로 “origin /”을 갖습니다. 마지막 부분 (마지막 / 뒤)을 결과 분기 이름으로 사용하려면 다음을 사용하십시오.
for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done
또한 모호한 참조에 대해 경고하지 않는 이점이 있습니다.
답변
여기에 대한 답변의 대부분은의 출력 구문 분석을 복잡하게 만듭니다 git branch -r
. 다음을 사용할 수 있습니다for
루프를 사용하여 리모컨의 모든 분기에 대해 추적 분기를 만들 .
예
이 원격 지점이 있다고 가정 해보십시오.
$ git branch -r
origin/HEAD -> origin/master
origin/development
origin/integration
origin/master
origin/production
origin/staging
로컬에서 이미 마스터 이외의 것을 추적하고 있지 않은지 확인하십시오.
$ git branch -l # or using just git branch
* master
이 하나의 라이너를 사용하여 추적 분기를 만들 수 있습니다.
$ for i in $(git branch -r | grep -vE "HEAD|master"); do
git branch --track ${i#*/} $i; done
Branch development set up to track remote branch development from origin.
Branch integration set up to track remote branch integration from origin.
Branch production set up to track remote branch production from origin.
Branch staging set up to track remote branch staging from origin.
이제 확인하십시오 :
$ git branch
development
integration
* master
production
staging
삭제하려면 :
$ git br -D production development integration staging
Deleted branch production (was xxxxx).
Deleted branch development (was xxxxx).
Deleted branch integration (was xxxxx).
Deleted branch staging (was xxxxx).
-vv
스위치를 사용하면 git branch
다음을 확인할 수 있습니다.
$ git br -vv
development xxxxx [origin/development] commit log msg ....
integration xxxxx [origin/integration] commit log msg ....
* master xxxxx [origin/master] commit log msg ....
production xxxxx [origin/production] commit log msg ....
staging xxxxx [origin/staging] commit log msg ....
for 루프 분석
루프는 기본적으로 명령을 호출 git branch -r
하여를 사용하여 출력에서 HEAD 또는 마스터 분기를 필터링합니다 grep -vE "HEAD|master"
. 분기의 이름에서 origin/
하위 문자열을 뺀 값을 얻으려면 Bash의 문자열 조작을 사용하십시오 ${var#stringtoremove}
. 변수 “stringtoremove”문자열이 제거됩니다 $var
. 이 경우 origin/
변수 에서 문자열 을 제거합니다 $i
.
참고 : 또는 git checkout --track ...
이 작업을 수행 할 수도 있습니다 .
$ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do
git checkout --track $i; done
그러나 나는이 방법에 관심이 없습니다. 체크 아웃을 수행 할 때 지점 사이를 전환하기 때문입니다. 완료되면 마지막으로 생성 한 지점으로 이동합니다.
참고 문헌
답변
2020 년 1 분기 업데이트 : Mohsen Abasi 는 2014 년 slm 의 답변을 기반으로 한 간단한 대안으로 의견을 제안합니다 .
for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//');
그리고 사용 $()
되지 않는 역 따옴표 대신 합니다.
다른 오래된 대답 에서 언급했듯이 사용 속도git for-each-ref
가 더 빠를 것 입니다.
그리고 새로운 (Git 2.23+) git switch
명령 을 사용하여 혼란git checkout
을 대체합니다 .
for i in $(git for-each-ref --format=%(refname:short) \
--no-merged=origin/HEAD refs/remotes/origin); do \
git switch --track $i; \
done
그렇게하지 grep
않아도됩니다.
Old (2011) 원래 답변 :
다음은 내가 사용하는 하나의 라이너입니다 (bash 쉘에서 msysgit1.7.4로 테스트 됨).
복사 붙여 넣기의 경우 :
remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname; done
가독성을 높이려면 :
remote=origin ; // put here the name of the remote you want
for brname in `
git branch -r | grep $remote | grep -v master | grep -v HEAD
| awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
git branch --set-upstream-to $remote/$brname $brname;
done
remote
변수에 지정한 리모콘에서 업스트림 분기 만 선택 합니다 ( ‘origin
‘또는 현재 Git 저장소의 리모콘 중 하나에 설정 한 이름이 ).- 지점의 이름을 추출합니다
origin/a/Branch/Name => a/Branch/Name
.awk
표현식을 . -
그것은 업스트림 지점을 통해 설정합니다
--set-upstream-to
(또는-u
) 하지--track
:
장점은 즉, 지점이 이미 존재하는 경우, 그것은 실패하지 않습니다하고 해당 분기 원점을 변경되지 않습니다, 그것은 단지 구성하는 것입니다branch.xxx.(remote|merge)
설정을.branch.aBranchName.remote=origin branch.aBranchName.merge=refs/heads/a/Branch/Name
이 명령은 모든 원격 업스트림 브랜치에 대한 로컬 브랜치를 만들고 원격 및 병합 설정을 해당 원격 브랜치로 설정합니다.
답변
충분히 쉽게 스크립트를 작성할 수는 있지만 언제 가치가 있는지 모르겠습니다. 그 지점은 꽤 빨리 뒤쳐져 서 항상 업데이트해야합니다.
원격 지점은 자동으로 최신 상태로 유지되므로 실제로 작업하려는 지점에서 로컬 지점을 만드는 것이 가장 쉽습니다.
답변
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done
답변
스크립팅없이 (빈 디렉토리에) :
$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout
그 후에는 모든 원격 지점이 로컬로 표시됩니다.