모든 Git 브랜치를 가져 오는 방법


1507

약 5 개의 분기가 포함 된 Git 리포지토리를 복제했습니다. 그러나 내가 할 때 나는 git branch그들 중 하나 만 볼 수 있습니다.

$ git branch
* master

나는 모든 가지 git branch -a를 볼 수 있다는 것을 알고 있지만 모든 가지를 어떻게 잡아 당기면 어떻게해야 git branch합니까?

$ git branch
* master
* staging
* etc...


2
사용 후 모든 지점을 얻을 수있는 방법이 질문에 쇼 --single-branch복제 설정 : stackoverflow.com/questions/17714159/...는 ( git fetch --all당신은 하나 개의 지점을 지정하지 않은 한 결코 작동하는지!)
마태 복음 Wilcoxson에게

2
별표가 현재 체크 아웃 된 분기를 나타내므로 출력이 표시되지 않습니다. 한 번에 하나의 지점 만 체크 아웃 할 수 있으므로 지점 목록의 왼쪽에 하나의 별표 만있을 수 있습니다.
Robino

5
나는 많은 답변을 보았지만 아무도 내가 원하는 것을 할 수있는 가장 쉬운 방법이라고 생각하는 것을 언급하지 않았습니다. git clone --bare <repo url> .git (마지막으로 "--bare"와 ".git"를 추가하여 레포를 복제 할 수 있습니다. "bare"repo)를 누른 다음 git config --bool core.bare false( "bare"플래그를 false로 설정) git reset --hardHEAD를 repo의 현재 HEAD로 이동합니다. 이제 git branch리포지토리의 모든 분기를 복제해야합니다.
Gabriel Ferraz

4
@GabrielFerraz 그런 다음 스택 오버플로에서 주석 기능을 남용합니다. 사용자는 귀하의 의견을 공감할 수 있지만 공감할 수는 없습니다.
파이프

답변:


2050

다음과 같이 모든 리모컨에서 모든 분기를 가져올 수 있습니다.

git fetch --all

기본적으로 힘의 움직임 입니다.

fetch이 언제든지 해당 지역의 지점에 안전하므로 원격 지사의 로컬 복사본 업데이트 하지만를 :

  1. fetch원격 지점 을 추적 하는 로컬 지점을 업데이트 하지 않습니다 . 로컬 브랜치를 업데이트하려면 여전히 모든 브랜치를 가져와야합니다.

  2. fetch원격 지점 을 추적 하는 로컬 지점을 만들지 않으므로 수동으로 수행해야합니다. 모든 원격 브랜치를 나열하려면 다음을 수행하십시오. git branch -a

원격 지점을 추적하는 로컬 지점 을 업데이트 하려면

git pull --all

그러나 여전히 충분하지 않을 수 있습니다. 원격 지점을 추적하는 로컬 지점에서만 작동합니다. 모든 원격 브랜치를 추적하려면이 oneliner를 실행하기 전에 실행하십시오 git pull --all.

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; DR 버전

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(pull은 모든 리모컨에서 모든 분기를 가져 오는 것처럼 보이지만 항상 확실하게 먼저 가져옵니다.)

서버에 로컬 지점에서 추적하지 않는 원격 지점이있는 경우에만 첫 번째 명령을 실행하십시오.

PS AFAIK git fetch --allgit remote update동일합니다.



Kamil Szot의 의견 은 유용합니다.

나는 사용해야했다 :

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

귀하의 코드가 이름이 지정된 로컬 브랜치를 생성했기 때문에 origin/branchname"refname 'origin / branchname'은 참조 할 때마다 모호합니다.


41
죄송합니다. 이것이 OP가 실제로 원하는 것이라고 상상할 수 없습니다. 'pull'명령은 'fetch + merge'이며 병합 부분은 모든 가지를 서로 겹쳐서 하나의 거대한 혼란을 남깁니다.
GoZoner

10
그 페치는 새로운 원격 브랜치를 생성하지 않을 것입니다. 여전히 체크 아웃해야합니다git checkout -b localname remotename/remotebranch
Learath2

125
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done 귀하의 코드가 origin / branchname이라는 로컬 브랜치를 생성했기 때문에 사용해야했습니다. "refname 'origin / branchname'은 참조 할 때마다 모호합니다.
Kamil Szot

22
다른 버전의 GIT를 사용하고 있는지 모르겠지만 스크립트를로 수정해야했습니다 git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done. 변경 사항이 HEAD를 제거합니다.
kim3er

16
Windows 사용자 :for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Max

718

원격 브랜치를 나열하려면 :
git branch -r

다음을 사용하여 현지 지점으로 확인할 수 있습니다.
git checkout -b LocalName origin/remotebranchname


88
이것은 위의 질문을 찾았을 때 찾고 있던 것과 정확히 같습니다. 원격 지점을 가져 오는 방법을 찾는 많은 사람들이 현재 작업 사본에 지점을 병합하고 싶지는 않지만 원격 지점과 동일한 로컬 지점을 원한다고 생각합니다.
Frug

11
지점이 로컬로 보이지 않더라도 할 수 git checkout remotebranchname있으며 작동합니다. 솔루션과의 차이점은 무엇입니까?
François Romain

12
기본 동작입니다. 이전 자식 버전에서는 그렇지 않았습니다. 사용 git checkout remotebranchname단지 새로운 생성하는 데 사용 관련이없는 이름이 지점 remotebranchname을 .
Learath2

12
받아 들여진 대답은 근본적으로 다른 일을하고 솔직하게 받아 들여지는 이유를 이해하지 못합니다
Learath2

8
OP는 모든 지점을 요청했습니다. 이 답변은 하나만 수행합니다.
Ted Bigham

193

원격 지점을 추적하는 로컬 지점을 만들어야합니다.

라는 리모컨이 하나만 있다고 가정하면 origin이 스 니펫은 모든 원격 추적에 대한 로컬 분기를 만듭니다.

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

그 후, git fetch --all원격 지사의 모든 로컬 사본을 업데이트합니다.

또한 git pull --all로컬 추적 분기를 업데이트하지만 로컬 커밋 및 '병합'구성 옵션 설정 방법에 따라 병합 커밋, 빨리 감기 또는 실패가 발생할 수 있습니다.


5
이것은 쉘 메타 문자를 포함하는 브랜치 이름에 대한 솔루션을 강화하고 (다른 답변에 대한 pinkeen의 의견에 따라) 가짜 오류 출력을 피합니다. git branch -r | grep -v- '->'| 원격으로 읽는 동안; git branch --track "$ {remote # origin /}" "$ remote"2> & 1 | grep -v '이미 존재합니다'; 완료
Daira Hopwood

6
당신은 확신하는 git pull --all모든 지역의 추적 브랜치를 업데이트합니다? 내가 알 수있는 한 모든 리모컨에서 현재 분기 만 업데이트합니다.
Andy

3
이랬어. 원격 분기와 일치하는 로컬 분기가 작성되지 않았습니다. "모든 원격 브랜치를 생성하여 로컬 브랜치를 생성하지 않으면 모든 브랜치를 생성"합니까?
JosephK

@JosephK 아마도 당신의 리모컨이 호출되지 origin않습니까? 모든 원격 이름에서 작동하는 이 답변 을 참조하십시오 .
Tom Hale

@TomHale "원산지"였지만 답장을 보내 주셔서 감사합니다. 하나 또는 두 개의 플래그가되어야하는 일을하기 위해서는 많은 것이 필요합니다. 나는 git의 일부 측면의 광기를 피하기 위해 gitless를 시도하고 있습니다.
JosephK

116

당신이 할 경우 :

git fetch origin

그들은 모두 현지에있을 것입니다. 그런 다음 다음을 수행하십시오.

git branch -a

remotes / origin / branch-name으로 표시됩니다. 그들이 로컬에 있기 때문에 원하는대로 무엇이든 할 수 있습니다. 예를 들면 다음과 같습니다.

git diff origin/branch-name 

또는

git merge origin/branch-name

또는

git checkout -b some-branch origin/branch-name

5
Google 에서이 페이지를 찾았습니다 ... 이것은 내가 찾고있는 실제 유형의 답변이었습니다. 첫 번째 명령을 시도했지만 오류가 발생했습니다. [$ git fetch --all origin fatal : fetch --all은 저장소 인수를 사용하지 않습니다] --- "git fetch --all"을 사용하면 트릭을 수행하는 것 같습니다. 리드 주셔서 감사합니다!
longda

1
고정 (제거됨 --all)
GoZoner

12
git fetch -all모든 리모컨의 모든 분기를 가져옵니다. git fetch origin리모컨의 모든 분기를 가져옵니다 origin. 나중은 OP가 요구 한 것입니다.
GoZoner

3
--all"해당 리모콘의 모든 분기"가 아니라 "모든 리모콘"을 의미합니다. 후자는 리모트로부터의 페치에 의해 암시됩니다.
spacediver

2
이것은 원격 저장소에서 모든 지점을 로컬 저장소로 가져 오는 방법이 아닙니다.
Vladimir Despotovic

69
$ git remote update
$ git pull --all

이것은 모든 분기가 추적된다고 가정합니다.

그렇지 않으면 Bash에서 이것을 실행할 수 있습니다.

for remote in `git branch -r `; do git branch --track $remote; done

그런 다음 명령을 실행하십시오.


3
시도해도 여전히 위와 동일한 결과가 나타납니다.
David542

4
@JacobLowe와 동일하지만 오류가 발생했지만 어쨌든 효과가있었습니다. '치명적 :'origin / master '라는 브랜치가 이미 존재합니다.'
AnneTheAgile

`origin / ->git branch -r
Tom Hale

또한 작동하지 않습니다. 나는 출력을 얻을 : Branch 'origin/quote-filenames' set up to track local branch 'master'. 원하는 출력은 다음과 같습니다 Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. 이다 뒤로 리모컨을 추적 할 수있는 원점을 설정. 수정 사항 은 이 답변 을 참조하십시오 .
Tom Hale

내가 필요한 것만 Mac을 전환 한 후 repo를 복제 한 후에도 다른 원격 지점을 체크 아웃 할 수 git fetch없어 작동하지 않았습니다. 따라서 여기서 교훈은 원격 브랜치를 추적해야한다는 것입니다. 그라시아 스!
빅터 라모스

58

Bash for루프가 나를 위해 작동하지 않았지만 이것은 내가 원하는 것을 정확하게했습니다. 내 원산지의 모든 가지가 로컬로 동일한 이름으로 미러링되었습니다.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

아래의 Mike DuPont 의 의견을 참조하십시오. Jenkins 서버 에서이 작업을 수행하려고 시도했지만 분리 된 헤드 모드로 남겨 두었습니다.


6
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository간단한 복제 후 생성 됩니다. 먼저 머리를 분리해야합니다. 나는 이것을했다git checkout <SHA>
brannerchinese

6
이것을 사용하는 나의 해결책은 git checkout --detach # detach the head다음과 같습니다git fetch origin \'+refs/heads/*:refs/heads/*
Mike DuPont

1
이것은 --tags 매개 변수를 사용하는 것을 제외하고는 나를 위해 일했습니다. git에 대한 표준적이고 간단한 프론트 엔드가 있었으면 좋겠다 .git에 10 개 이상의 스택 오버플로 응답이 필요한 간단한 것들이 터무니없는 것입니다!
kristianp

1
@kristianp Ungit 또는 GitKraken을 체크 아웃 했습니까?
dragon788

@ dragon788 git GUI에 SourceTree를 사용하고 있지만 스크립팅 작업을위한 더 간단한 명령 줄에 대해 이야기하고있었습니다.
kristianp

51

사용하십시오 git fetch && git checkout RemoteBranchName.

그것은 나를 위해 아주 잘 작동합니다 ...


6
이것이 새로운 최고의 답변입니다. 이전에는 불가능했을지 모르겠지만 최신 버전의 Git은 적어도 원격 지점을 체크 아웃하려고 시도하고 자동으로 로컬 추적 지점을 설정한다는 것을 알 수 있습니다 (필요하지 않습니다) 을 지정 origin/branch하면 충분합니다 branch.
Neil Traft

9
이것은 원래의 질문에 대한 답이 아닙니다. 그것은 하나씩 확장하여 확장 할 수 없습니다.
ingyhere

이 날 내가 만난 모든 상황에서 원격 지사를 당길 수있는 유일한 대답했다
엠마뉴엘 Buckshi

38

리포지토리를 복제하면 분기의 모든 정보가 실제로 다운로드되지만 분기는 숨겨집니다. 명령으로

$ git branch -a

저장소의 모든 브랜치를 표시하고 명령을 사용하여

$ git checkout -b branchname origin/branchname

그런 다음 한 번에 하나씩 수동으로 "다운로드"할 수 있습니다.


그러나 조금 더 복잡하지만 훨씬 더 깨끗하고 빠른 방법이 있습니다. 이를 위해서는 세 단계가 필요합니다.

  1. 첫 번째 단계

    머신에 비어있는 새 폴더를 만들고 저장소에서 .git 폴더의 미러 사본을 복제하십시오.

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    my_repo_folder 폴더의 로컬 저장소가 여전히 비어 있으면 터미널에서 "ls -alt"명령으로 볼 수있는 숨겨진 .git 폴더 만 있습니다.

  2. 두번째 단계

    git 구성의 boolean 값 "bare"를 false로 전환하여이 저장소를 빈 저장소에서 일반 저장소로 전환하십시오.

    $ git config --bool core.bare false
    
  3. 세 번째 단계

    현재 폴더 안에있는 모든 것을 잡고 로컬 컴퓨터에 모든 브랜치를 생성하여 정상적인 저장소로 만듭니다.

    $ git reset --hard
    

이제 명령을 입력하면 git branch모든 브랜치가 다운로드되었음을 알 수 있습니다.

이것은 모든 브랜치를 가진 git 저장소를 한 번에 복제 할 수있는 빠른 방법이지만, 이런 방식으로 모든 단일 프로젝트에 대해하고 싶은 것이 아닙니다.


1
숨겨진 가지에 대한 언급으로 찬성. 현지 지점 추적을 엄청나게 이해하는 데 도움이되었습니다.
mburke05

좋은 대답이지만 질문은 매일 사용하는 것을 의미합니다. 매번 저장소를 복제하는 것은 실용적이지 않습니다.
Z. 쿨라

재설정으로 모든 분기가 로컬로 생성되는 이유는 무엇입니까?
Z. 쿨라

@ Z.Khullah 모든 브랜치를 만드는 리셋이 아니라 클론-미러입니다. 불행히도 우리에게는 2 단계와 3 단계가 바뀌는 베어 레포가 생성됩니다.
ScottJ

29

다음을 통해 모든 분기를 가져올 수 있습니다.

git fetch --all

또는:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000당신이 저장소 shallowed 한 경우 매개 변수는 도움이 될 수 있습니다.


모든 가지를 당기려면 다음을 사용하십시오.

git pull --all

위의 방법으로 문제가 해결되지 않으면 위의 명령 앞에 다음을 입력하십시오.

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

으로 remote.origin.fetch지원할 수있는 경우에만 특정 지점 당신이 당신의 repo를 복제, 특히 가져 오는 동안 --single-branch. 다음을 확인하십시오 : git config remote.origin.fetch.

그 후에는 모든 지점을 체크 아웃 할 수 있어야합니다.

또한보십시오:


모든 가지를 리모컨에 밀어 넣으려면 다음을 사용하십시오.

git push --all

결국 --mirror모든 심판을 반영합니다.


리포지토리를 복제하는 것이 목표 인 경우 : GitHub에서 리포지토리 기사 복제를 참조하십시오 .


1
굉장합니다 ...이 페이지의 솔루션 전에 다른 모든 것을 시도했습니다. 고마워요!
Sujoy

2
나는 얕은 클로닝 ( depth=1)을 사용했고 설정은 또한 하나의 특정 브랜치를 지정했다 fetchdepth=1000매개 변수는 특정 원격 브랜치를 체크 아웃하는 데 도움이되는 수정 사항이었다
Sandra

2
pull --all모든 가지가 아니라 모든 리모컨을 당기지 않습니다
Z. Khullah

그래도 구성에 대한 좋은 트릭! 모든 모든 시간을 가져올 것인가
Z. Khullah에게

작성한대로 구성을 확인했지만 여전히 현재 분기에서만 작동합니다. 여기에 모든 답변이 나를 위해 작동하지 않는 것 같습니다 ...
Alexei Martianov

25

나는 보통 다음과 같은 명령 외에 다른 것을 사용하지 않습니다.

git fetch origin
git checkout --track origin/remote-branch

조금 더 짧은 버전 :

git fetch origin
git checkout -t origin/remote-branch

17

다음과 같이 저장소를 복제했다고 생각합니다.

git clone https://github.com/pathOfrepository

이제 cd를 사용하여 해당 폴더로 이동하십시오.

cd pathOfrepository

입력 git status하면 모두 볼 수 있습니다.

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

숨겨진 분기 유형을 모두 보려면 :

 git branch -a

모든 원격 브랜치를 나열합니다.

이제 특정 지점에서 체크 아웃하려면 다음을 입력하십시오.

git checkout -b localBranchName origin/RemteBranchName

16

모든 지점을 가져 와서 다른 Git 서버로 모든 것을 마이그레이션하는 솔루션을 찾고 있다면 아래 프로세스를 정리하십시오. 모든 브랜치를 로컬에서 업데이트하려면 첫 번째 빈 줄에서 중지하십시오.

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

3
매우 도움이됩니다. 정확히 내가 필요한 것. 내가 바꾸어야 할 유일한 것은 두 번째 줄에 있었고, 'HEAD'와 'master'에 작은 따옴표를 추가했습니다. 아마도 zsh를 사용하고 있기 때문일 것입니다. 감사!
sockmonk

이것은 기본적으로 다음을 수행합니다. (1) 원격 브랜치의 실제 이름을 얻는 것 [마스터가 아닌 헤드가 아닌]; (2) Git에게 추적하도록 완전히 지시 [모든 솔루션이이 작업을 수행하는 것은 아님]; (3) 태그를 포함하여이 가지에서 모든 것을 가져 와서 가져 오기; (4) 새로운 원점을 설정하고 모든 것을 완전히 밀어 올리면서 걷는 것. 다시 말하지만, 대부분의 다른 솔루션은 모든 부분을 이동시키지 못합니다. 이것이 전부입니다.
ingyhere

1
나는 grep을 실행하는 antipattern을 제거한 다음 awk를 사용하여 grep 명령을 awk 명령으로 압축했습니다. 감사합니다 tripleee !
ingyhere

이 글을 읽고 git fetch git pull stackoverflow.com/a/292359/1114926
Green

힘내는 pull참으로 하는가 fetch를 먼저하지만 문제가에있는 경우, 이야기하는 것이 더 쉽습니다 fetch의 일부 pull또는 이후 merge의 일부 pull경우 fetch독립적으로 실행됩니다.
ingyhere

12

마스터 리포지토리를 복제 한 후에는 실행할 수 있습니다.

git fetch && git checkout <branchname>

1
단순한. 그리고 원격 원산지에서 지점을 얻기 위해 일했습니다
sirvon

3
이것은 원래의 질문에 대한 답이 아닙니다. 그것은 하나씩 확장하여 확장 할 수 없습니다. 100 개 지점의 경우를 고려하십시오.
ingyhere

10

모든 원격 브랜치를 파일로 가져올 수 있는지 확인하십시오 .git/config.

이 예제에서는 origin/production브랜치를 git fetch --all가져 오는 것 외에는 아무 것도 시도하지 않더라도 production브랜치 만 페치 가능합니다 .

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

이 줄은 다음으로 대체되어야합니다.

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

그런 다음 git fetch등을 실행하십시오 ...


3
검사 : git config --get remote.origin.fetch그리고 (파괴적으로) 설정 :git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

또는 .git 디렉토리의 구성 텍스트 파일을 수정하여 나를 위해 일했습니다.
FDIM

9

루핑이 나에게 효과가없는 것 같아서 출발지 / 마스터를 무시하고 싶었습니다. 여기 나를 위해 일한 것이 있습니다.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

그 후 :

git fetch --all
git pull --all

1
이것의 변형은 정답이지만, 모든 경우에서 작동하지는 않습니다. 또한 지점 이름이 펑키 할 수 있습니다. 그래서 나는 다음과 같이했다 : git branch -r | grep -v 헤드 | grep –v master | awk -F'origin / ''{print $ 2 ""$ 1 "origin /"$ 2} '| xargs -L 1 git branch -f --track; git fetch --all; git pull --all; 그리고 트릭을 했어!
ingyhere

3
grep | awk 반 패턴 을 피하기위한 문체 개선 : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee

7

이 세 가지 명령만으로 모든 가지를 얻을 수 있습니다.

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

이것이 실제로 OP 문제의 근본입니다. 올바르게 복제 된 경우을 수행 할 필요가 없습니다 pull --all. 그러나 여전히 필요한 경우 @Johnno Nola의 다른 답변은 모든 지점이 추적 되고이 답변과 혼합되어 있다고 가정하면 갈 수있는 방법입니다.
Dr Beco

7

아무도 왜 사람들의 질문에 대답하고 무슨 일이 일어나고 있는지 설명하지 않습니까?

  1. 모든 원격 분기 (또는 추적하려는 분기)를 추적하고 있는지 확인하십시오 .
  2. 원격 지점을 반영하도록 로컬 지점을 업데이트하십시오.

모든 원격 지점을 추적하십시오.

원격 저장소에있는 모든 분기를 추적하십시오.

수동으로 수행하십시오.

당신은 대체 할 <branch>의 출력에서 표시되는 지점으로 git branch -r.

git branch -r
git branch --track <branch>

bash 스크립트로 수행하십시오.

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

로컬 컴퓨터의 원격 브랜치에 대한 정보를 업데이트하십시오.

로컬 리포지토리에서 추적중인 원격 리포지토리에서 분기에 대한 업데이트를 가져옵니다. 이것은 로컬 브랜치를 변경하지 않습니다. 로컬 git repo는 이제 원격 repo 브랜치에서 발생한 일을 인식합니다. 예를 들어, 새로운 커밋이 원격 마스터로 푸시되었으며 가져 오기를 수행하면 로컬 마스터가 1 개의 커밋에 의해 뒤처 졌음을 경고합니다.

git fetch --all

로컬 컴퓨터의 원격 분기에 대한 정보를 업데이트하고 로컬 분기를 업데이트하십시오.

원격에서 로컬 브랜치까지 모든 브랜치에 대해 페치 및 병합을 수행합니다. 예를 들어, 새 커밋이 원격 마스터로 푸시 된 경우 풀을 수행하면 원격 지점의 변경 사항에 대한 로컬 리포지토리가 업데이트 된 다음 해당 변경 사항이 로컬 지점에 병합됩니다. 병합 충돌로 인해 상당히 혼란 스러울 수 있습니다.

git pull --all

4

새 저장소를 복제하고 모든 원격 지점에 대해 로컬 지점을 만드는 작은 스크립트를 작성했습니다.

최신 버전은 여기에서 찾을 수 있습니다 .

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

그것을 사용하려면, 그것을 git bin 디렉토리 (나를 위해)에 복사 C:\Program Files (x86)\Git\bin\git-cloneall한 다음 명령 줄에 복사하십시오 .

git cloneall [standard-clone-options] <url>

평소와 같이 복제되지만 모든 원격 분기에 대한 로컬 추적 분기를 만듭니다.


4

단일 리모트를 추적하는 모든 Git 브랜치를 가져 오는 방법.

이것은 Windows 10의 Red Hat 및 Git Bash에서 테스트 및 기능되었습니다.


TLDR :

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

설명:

한 라이너가 체크 아웃 한 다음 HEAD를 제외한 모든 분기를 가져옵니다.

원격 추적 분기를 나열하십시오.

git branch -r

HEAD를 무시하십시오.

grep -v ' -> '

리모컨에서 분기 이름을 제거하십시오.

cut -d"/" -f2

단일 리모컨을 추적하는 모든 지점을 확인하십시오.

git checkout $branch

체크 아웃 된 분기를 가져옵니다.

git fetch

기술적으로 가져 오기는 새로운 로컬 지점에는 필요하지 않습니다.

이 중 하나를 사용할 수 있습니다 fetch또는 pull모두 새로운 원격 (들)에 변경 사항이 분기합니다.

병합 할 준비가되었을 때만 당기십시오.


테스트 설정

SSH URL로 저장소를 확인하십시오.

git clone git@repository.git

전에

현지에서 지점을 확인하십시오.

$ git branch
* master

실행 명령

하나의 라이너를 실행하십시오.

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

로컬 지점에 원격 지점이 포함되어 있는지 확인하십시오.

$ git branch
  cicd
  master
* preprod

4

PowerShell을 사용하는 Windows 사용자의 경우 :

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

이것은 / 이름으로 분기와 함께 작동합니다. git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Markus

3

여기에 내가 견고하다고 생각하는 것이 있습니다.

  • 기존 지점에 대한 원격 추적을 업데이트하지 않습니다
  • HEAD추적 을 위해 업데이트 를 시도하지 않습니다origin/HEAD
  • 이외의 이름의 리모컨을 허용합니다 origin
  • 셸 인용
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

그것은 필요는 없습니다 git fetch --all통과로 -allgit pull패스 내부에이 옵션을 fetch.

이 답변에 대한 크레딧 .


2

허용 된 답변에 제공된 1 줄짜리 펄 버전은 다음과 같습니다.

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

원하는 경우 출력 파일을 셸 스크립트로 실행할 수 있습니다.

우연히 Stash 프로젝트 저장소를 삭제했습니다. 운 좋게도 누군가 실수로 손실되기 직전에 포크를 만들었습니다. 나는 포크를 내 지역에 복제했다 (내가 한 일에 대한 세부 사항은 생략 할 것이다). 내가 지역에서 포크를 완전히 가지고 나면, 나는 하나의 라이너를 달렸다. 복구하려는 대상 저장소를 가리 키도록 원격 URL (필자의 경우 원본)을 수정했습니다.

git remote set-url origin <remote-url>

그리고 마지막으로 모든 지점을 다음과 같이 시작했습니다.

git push --all origin

우리는 사업을 다시 시작했습니다.


1

모든 브랜치 또는 태그 이름을 임시 파일에 넣은 다음 각 이름 / 태그에 대해 git pull을 수행 할 수 있습니다.

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

1

문제가있는 경우 fetch --all원격 지점을 추적하십시오.

git checkout --track origin/%branchname%

1

'치명적 :'origin / master '라는 분기가 이미 존재합니다'라는 오류 메시지를 피하려면 다음이 필요합니다.

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

0

Learath2의 답변을 바탕으로 작성된 디렉토리에 수행 한 후 수행 한 작업은 다음 git clone [...]cd같습니다.

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

나를 위해 일했지만 그것이 당신에게 효과가 있는지 알 수 없습니다. 조심해.


0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

이제 로컬로 당신 yourNewLocalBranchName입니다 requiredRemoteBranch.


0

Visual Studio 사용자의 경우 패키지 관리자 콘솔에서 다음을 수행하십시오.

자식 분기 | % {git fetch upstream; 자식 병합 업스트림 / 마스터}


0

여러 가지 방법을 시도했지만이 방법 만 간단하고 저에게 효과적입니다.

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

별칭 설정 : (상위 답변을 기반으로)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

이제 모든 지점을 추적하십시오.

git track-all-branches

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.