모든 원격 Git 분기를 로컬 분기로 추적
단일 원격 분기를 로컬 분기로 추적하는 것은 매우 간단합니다.
$ 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을 검색했지만, 지금까지 침대에 올라왔습니다.
오토가 제공한 답변은 좋지만, 생성된 모든 분기는 이름의 시작 부분으로 "origin/"을 사용합니다.마지막 부분(마지막 / 뒤)을 결과 분기 이름으로 사용하려면 다음을 사용합니다.
for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done
또한 애매한 ref에 대한 경고를 주지 않는 장점이 있습니다.
bash 사용:
git 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
비트 1.9.1 이전크레딧: 발 블랑, 엘리아스, 휴고
참고: 다음 코드가 이후 버전의 git(>v1.9.1)에서 사용될 경우 원인이 됩니다.
- (bug) 마스터를 추적하기 위해 생성된 모든 분기
- (으) 앞에 (으)로 된 로컬
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
애매한 refname 경고를 무시하세요. 로컬 지점을 선호하는 것 같습니다.
여기서 대부분의 답변은 출력의 구문 분석을 복잡하게 만드는 것입니다.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} "string remove"라는문자열이 됩니다.$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/^[ ]\+//'); do git switch --track $i; done
그리고 그것은 쓸모없는 백트릭 대신에 사용합니다.
다른 오래된 답변에서 언급했듯이, 사용하는 것이 아마도 더 빠를 것입니다.
그리고 저는 혼란스러운 것을 대체하는 새로운 (Git 2.23+) 명령을 사용할 것입니다.
for i in $(git for-each-ref --format=%(refname:short) \
--no-merged=origin/HEAD refs/remotes/origin); do \
git switch --track $i; \
done
안 돼, 안 돼, 안 돼, 안 돼, 안 돼, 안 돼!grep필요했다.
구(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또는 현재 Gitrepo의 원격 중 하나에 대해 설정한 이름이 무엇이든 상관없습니다.분의이다니추출합름을기다니.
origin/a/Branch/Name => a/Branch/Name를 .awk표현.업스트림 분기를 (또는) 통해 설정합니다.
--track:
이점은 분기가 이미 존재하는 경우 실패하지 않고 해당 분기 오리진을 변경하지 않고 다음만 구성한다는 것입니다.branch.xxx.(remote|merge)설정branch.aBranchName.remote=origin branch.aBranchName.merge=refs/heads/a/Branch/Name
이 명령은 모든 원격 업스트림 분기에 대한 로컬 분기를 만들고 해당 원격 및 병합 설정을 해당 원격 분기로 설정합니다.
스크립팅 없이(빈 디렉토리에서)
$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout
그런 다음 모든 원격 지점이 로컬로 표시됩니다.
그렇게 쉽게 대본을 작성할 수는 있겠지만, 언제가 가치가 있을지는 모르겠습니다.이러한 지점들은 상당히 빠르게 뒤쳐질 것이며, 항상 업데이트해야 합니다.
원격 분기는 자동으로 최신 상태로 유지되므로 실제로 작업하려는 지점에 로컬 분기를 만드는 것이 가장 쉽습니다.
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done
파워셸을 사용하고 싶을 때 리모컨을 오리진이라고 합니다.그러면 효과가 있습니다.
git fetch
git branch -r | %{$_ -replace " origin/"} | %{git branch --track $_ "origin/$_"}
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do git branch --track ${branch##*/} $branch; done
이를 사용하면 다음과 같은 경고가 표시되지 않습니다. refname 'origin/dev'가 모호합니다.
다음은 @tjmcewan이 참조하는 BASH 명령에 대한 내 솔루션입니다.
for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done
$remote 변수가 여전히 "origin/:"을 포함하고 있다는 것을 테스트했기 때문에 생성된 모든 분기에 "origin/"이 이름의 시작으로 포함되는 문제를 해결하는 것이 목표입니다.
for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done
git 2.23 이후:
for branch in `git branch -r | grep origin/`; do git switch -t -C ${branch#origin/} $branch; git pull; done
그-C에 대한 깃발.git switch생성하거나 재설정합니다(이미 존재하는 경우)
Windows에서 tjmcewan의 응답과 동일하게 하려면 배치 파일에서 다음을 호출합니다.
for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r
또는 명령행의 다음과 같습니다.
for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r
VonC의 솔루션은 sed를 변경하여 훨씬 더 단순화할 수 있습니다(그의 게시물에 직접 언급할 담당자가 부족합니다).
for branch in $(git branch -r | sed 's,[^/]*/,,g'); do git switch $branch; done
슬래시가 아닌 모든 항목을 최종 슬래시까지 교체함으로써 나머지 분기 이름은 로컬 사용에 적합합니다. 동일한 분기로 반복적으로 전환하는 것은 오류가 아닙니다. (비효율적일 수 있지만 파이프에 grep가 있는 것보다 더 효율적일 수 있습니다. :->
switch 명령은 필요에 따라 각 원격 분기를 추적할 수 있을 정도로 똑똑합니다.
bash를 사용하여 모든 분기를 체크아웃하려면:
for remote in `git branch -r`; do git checkout $(echo $remote | cut -d'/' -f 2); done
새 원격 추적 분기를 가져오는 가져오기를 수행할 때 자동으로 해당 분기의 로컬 편집 가능한 복사본이 없습니다.
이미 몇 개의 지점을 체크아웃하고 싶은 경우
- 원격에서 나머지 모든 분기를 체크아웃합니다.
- 모든 로컬 분기가 원격 분기를 추적하는지 확인합니다.
다음 bash 및 zsh 호환 스크립트를 사용할 수 있습니다.
git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done
for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"`
do
git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch;
done
설명:
line 1: 'git branch -r'('git remote update' 다음에 나오는 'git remote update')는 모든 원격 분기를 나열합니다. 'egrep -vw'는 HEAD와 마스터가 있는 항목을 노크하는 데 사용됩니다.
line 3: 로컬에서 체크아웃하는 동안 명명된 원격 지점을 추적합니다.단순한 awk는 'origin/'이 로컬 분기의 접미사가 되지 않도록 하기 위해 사용됩니다.
언급URL : https://stackoverflow.com/questions/379081/track-all-remote-git-branches-as-local-branches
'programing' 카테고리의 다른 글
| Sql JOIN 순서가 성능에 영향을 미칩니까? (0) | 2023.06.22 |
|---|---|
| 도커 내부에서 시작할 때 스프링 부팅 응용 프로그램이 부팅되지 않음 (0) | 2023.06.22 |
| NA를 최신 비NA 값으로 대체 (0) | 2023.06.22 |
| C에서 32비트 부호 없는 정수의 특정 'n' 비트를 어떻게 추출합니까? (0) | 2023.06.22 |
| Git 브랜치를 자체 저장소로 이동하려면 어떻게 해야 합니까? (0) | 2023.06.22 |