Git에서 모든 원격 브랜치를 복제하는 방법?


4129

나는 GitHub으로 푸시 된 a masterdevelopment브랜치를 가지고있다 . 나는 d, ed, ed를했지만 지점 이외의 다른 것을 얻을 수는 없습니다 .clonepullfetchmaster

나는 분명한 것을 놓치고 있다고 확신하지만 매뉴얼을 읽었으며 전혀 기쁨을 얻지 못했습니다.


133
여기에 허용 된 답변 ( git branch -a)은 리모컨의 가지를 보여 주지만 그중 하나를 확인하려고하면 '분리 HEAD'상태가됩니다. 다음 답변 (두 번째로 많은 투표)은 다른 질문에 대답합니다 (위트 : 모든 가지를 당기는 방법, 다시 말하면 로컬로 추적하는 사람들에게만 적용됩니다). 여러 의견 git branch -a은 모든 원격 브랜치를 로컬로 추적하는 쉘 스크립트로 결과를 구문 분석 할 수 있다고 지적합니다 . 요약 : 원하는 것을 할 수있는 git 기본 방법이 없으며 어쨌든 그렇게 좋은 아이디어는 아닙니다.
데이 데이비스 워터 베리

5
아마도 전체 폴더를 구식으로 복사합니까? scp some_user@example.com:/home/some_user/project_folder ~이 솔루션이 github에서 작동하는지 확실하지 않습니다 ..
snapfractalpop

19
"복제, 가져 오기 및 페치했습니다"라고 말하는 대신 실행 한 정확한 명령 을 보여주는 것이 좋습니다 .
밥 길모어

57
"복제"가 정확한 사본의 의미가 아닌 이유는 항상 저를 혼란스럽게합니다. 정확한 클론이라면 모든 브랜치가 로컬 리포지토리의 일부가 아니어야합니까? 그게 배포 지점 중 하나가 아닙니까? 따라서 저장소가 없어도 여전히 모든 사본이 있습니다. 아니면 이른바 "원격"이 실제로 로컬 리포지토리의 일부입니까?
huggie

21
모든 공감대, 답변, 답변에 대한 의견 및 마음에 드는 수 많은 견해를 보면, git 이이 작업을 수행하는 명령을 추가 한 시간이라고 생각합니다. 그리고 바로 당신은 @ huggie입니다. 제 생각은 정확히입니다.
Sнаđошƒаӽ

답변:


4557

먼저 원격 Git 리포지토리를 복제 하고 CD 로 들어갑니다.

$ git clone git://example.com/myproject
$ cd myproject

다음으로 저장소의 로컬 브랜치를 살펴보십시오.

$ git branch
* master

그러나 저장소에 다른 지점이 숨겨져 있습니다! -a플래그를 사용하여 다음을 볼 수 있습니다 .

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

업스트림 지점에서 간단히 살펴보고 싶다면 직접 확인하십시오.

$ git checkout origin/experimental

그러나 해당 지점에서 작업하려면 다음을 통해 자동으로 수행되는 로컬 추적 지점을 만들어야합니다.

$ git checkout experimental

그리고 당신은 볼 것이다

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

그 마지막 줄은 어떤 사람들을 던졌습니다 : "새로운 지점"-응? 실제로 의미하는 것은 지점에서 인덱스를 가져 와서 로컬로 생성한다는 것입니다. 이전 이 지점은 일반적으로 원산지 / branch_name 분기를 의미 원격 브랜치를 추적하도록 설정되고 있음을 알려줍니다로 라인은 실제로 더 많은 정보입니다

이제 현지 지점을 보면 다음과 같이 표시됩니다.

$ git branch
* experimental
  master

를 사용하여 실제로 둘 이상의 원격 저장소를 추적 할 수 있습니다 git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

이 시점에서 상황은 꽤 미쳐 gitk가고 있으므로 무슨 일이 일어나고 있는지 확인하십시오.

$ gitk --all &

119
예를 들어, 원산지 / 실험에 대한 실험과 같이 모든 원격 지사를 어떻게 자동으로 만들 수 있습니까?
Cristian Ciupitu 2016 년

54
크리스티안 : 모든 분기 'origin / foo'에 대해 항상 분기 'foo'를 만들곤했지만 이로 인해 두 가지 문제가 발생했습니다. 및 (2) 이전 버전의 git에서 'git push'를 실행하면 분기가 오래 된 경우에도 모든 로컬 분기를 원격으로 푸시하려고 시도합니다. 따라서 현재 적극적으로 개발중인 항목에 대해서만 로컬 지점을 유지하고 해당 지점에 대한 정보가 필요한 경우 원점 / * 지점에 직접 액세스합니다. (즉, 'git branch -a'를 파싱하기 위해 쉘 스크립트를 사용할 수있다.)
emk

49
"git fetch <origin-name> <branch-name>"은 지점을 로컬로 가져옵니다.

137
좋은 대답이지만 다소 질문을 그리워합니다. 나는 모든 원격 지점을 체크 아웃하기위한 하나의 라이너를 찾고있었습니다.
cmcginty

32
문제는 모든 원격 브랜치를 복제하지 않고 복제하는 것입니다. 그리고 위에서 언급했듯이, 당신은 정말로 더 이상 부실해질 때 두통을 일으킬 수 있기 때문에 필요 이상으로 더 많은 지역 추적 지점을 만들고 싶지 않습니다.
emk

822

한 번에 가져 오려는 원격 분기가 많은 경우 다음을 수행하십시오.

$ git pull --all

이제 원격 저장소에 충돌하지 않고 필요에 따라 모든 지점을 체크 아웃 할 수 있습니다.


12
git clone을 사용하면 마스터 분기가 로컬로 있고 10 개의 분기가 "원격"입니다. 따라서 Gabe의이 답변은 매우 도움이되었으며 질문에 대한 답변입니다.
basZero

38
이것은 단지 로컬에없는 추가 된 원격 지사 가져 오는 모든 원격 지사
jujule

33
첫 번째 명령은 중복입니다. 단순히 git pull --all똑같이 할 것입니다 – 두 번 가져 오지 않습니다. 그리고 infosec812는 이것이 질문에 대답하지 않는 것이 옳습니다. 나는 이것이 어떻게 많은 투표를 받았는지 궁금합니다.
Sven Marnach

6
내가 한 후에 git remote update시도한 후에는 git branch로컬 지점 만 볼 수 있습니다. 그러나 내가 git branch -a하면 원격 지점을 볼 git pull <branchname>수 있으며 원하는 지점을 얻을 수 있습니다 . -Google 검색에서이 질문에 답한 후이 답변으로 문제를 해결했습니다.
WNRosenberg

38
이것은 전혀 도움이되지 않습니다. 기존의 다른 가지를 당기지 마십시오.
Avinash R

446

Bash 스크립트가 도움 이 되었습니다.

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

마스터를 제외한 모든 원격 브랜치에 대한 추적 브랜치를 생성합니다 (원래 복제 명령에서 얻은 것임). 아직도해야 할 것 같아요

git fetch --all
git pull --all

확인하기.

하나의 라이너 : git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
평소와 같이 : 우리가 알고있는 것처럼 rm -rf universe을 복사하기 전에 설정에서 테스트하십시오.

원 라이너 크레딧은 사용자 cfi로 이동


19
이것은 정말 완벽한 솔루션에 가깝습니다.이 기능이 git에 옵션으로 내장되어 있다면 더 나아질 수 있습니다.
Deven Phillips

51
"하나의 라이너": git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs 평소대로 : 복사하기 전에 설정에서 테스트rm -rf universe as we know it
cfi

4
이 명령은 기능 분기가 아닌 일반 분기로 원격에서 기능 분기를 작성합니다.이 문제를 해결하는 방법은 무엇입니까?
Alex2php

4
지점 이름에 "/"관련 문제가 발생하면 자식 별칭을 사용하는 솔루션이 아래에 있습니다. "nobody"의 답변보기 "answered May 15 '13 at 11:02"
wemu

8
remotes/origin/네임 스페이스를 유지하기 위해 트리밍 for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
만합니다

348

--mirror옵션을 사용하면 remote추적 분기가 제대로 복사되는 것 같습니다 . 그러나 저장소를 기본 저장소로 설정하므로 나중에 일반 저장소로 다시 설정해야합니다.

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

참조 : 힘내 FAQ : 원격으로 추적 된 모든 분기가있는 저장소를 어떻게 복제합니까?


7
당신은 이것이 투표가 없어도 실제로는 좋은 대답으로 보인다는 것을 알고 있습니다. 그런 식으로 함정이 있습니까? 해당 명령을 실행 한 후 명시 적으로 지점을 체크 아웃해야했습니다.
루프

27
이것은 git push --mirror와 결합하여 github.com에서 github 엔터프라이즈 설치로 이동할 때 원격 git repo의 정확한 복제본을 만드는 데 필요한 것입니다. 감사!
Jacob Fike

3
@Dave : git checkout마지막 명령으로 final 을 추가 하여 복제 된 리포지토리에서 현재 분기의 헤드를 최종 체크 아웃합니다. 이것은 최고의 답변입니다. 용감하십시오, 결국 우리는 당신을 정상으로 데려 갈 것입니다 :-)
cfi

3
@ 데이브 : 흠. 나는 두 번째 생각을 가지고 있습니다 : --mirror는 모든 지점을 추적하는 것 이상을 수행합니다. 원점의 모든 참조를 복사하고 후속 적으로 git remote update다시 수행합니다. 당김 동작의 변화. 전체 사본에는 한 줄짜리 스크립트가 필요하다고 믿었습니다.
cfi

5
git clone --mirrorgit 저장소를 백업하는 데 매우 좋습니다 ^ _ ^
TrinitronX

220

멋진 "git checkout -b somebranch origin / somebranch"구문을 사용하지 않고 분기로 쉽게 전환 할 수 있습니다. 당신은 할 수 있습니다 :

git checkout somebranch

힘내 자동으로 올바른 일을 할 것입니다 :

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git은 동일한 이름의 브랜치가 정확히 하나의 리모트에 존재하는지 여부를 확인하고, 존재하는 경우 원격 브랜치임을 명시 적으로 지정한 것처럼 동일한 방식으로 추적합니다. Git 1.8.2.1의 git-checkout 매뉴얼 페이지에서 :

<branch>를 찾을 수 없지만 이름이 일치하는 정확히 하나의 원격 (<remote>)에 추적 분기가있는 경우

$ git checkout -b <branch> --track <remote>/<branch>

1
따라서 브랜치 checkout의 이름이 원격 브랜치의 이름과 동일하면 "/"뒤의 모든 것이 git에서 동일한 이름의 브랜치를 생성합니다. ? 그리고 추적에 의해, 우리는 의미 : git push, git pull, 등은 원격에서 수행 할 것인가? 이것이 맞다면 @Daniel에 동의하기 때문에 더 많은 정보로 답변을 확장하십시오.이 답변은 더 많은 담당자가 필요합니다.
제라드 로슈

5
@ BullfrogBlues, 모든 질문에 대한 대답은 예인 것 같습니다 (git v1.7.7.4를 사용하고 있습니다). 나는이 행동이 더 잘 알려 져야한다는 데 동의합니다. (이 버전의 git 매뉴얼에는 없습니다.) 실제로이 동작을 좋아하지 않습니다. 오히려 오류가 발생하고 git checkout --track origin/somebranch명시 적으로 말해야 합니다.
dubiousjim

3
@ dubiousjim : 실제로, 이것은 매뉴얼에 있습니다. git-checkout (1)의 말 : "<branch>를 찾을 수 없지만 일치하는 이름을 가진 정확히 하나의 원격에 추적 분기가있는 경우 (<remote>) 'git checkout -b <branch > --track <remote> / <branch> ' "(Git V.1.8.1.1).
sleske 2012

필요한 것은 $ git pull * <remote> / *-여기서 "*"는 와일드 카드이므로 아직 로컬 시스템에없는 분기를 포함하여 모든 분기를 가져옵니다. 이것을하는 방법? 코드를 로컬 시스템으로 가져 오기 위해 모든 브랜치를 체크 아웃 / 풀해야합니까?
JosephK

98

에 관해서,

$ git checkout -b 실험적 기원 / 실험

사용

$ git checkout -t origin/experimental

더 장황하지만 기억하기 쉬운

$ git checkout --track origin/experimental

원격 저장소 추적 측면에서 더 좋습니다.


따라서 두 번째 양식은 기억하기 쉬우 며 다른 차이점은 없습니다.
aderchox

79

가져 오는 페치는 모든 원격 브랜치를 가져와야하지만 로컬 브랜치를 만들지는 않습니다. gitk를 사용한다면, "remotes / origin / dev"또는 이와 유사한 것으로 기술 된 원격 브랜치를 볼 수있을 것입니다.

원격 지점을 기반으로 로컬 지점을 만들려면 다음과 같이하십시오.

git checkout -b dev 심판 / 원격 / 원산지 / dev

다음과 같은 것을 반환해야합니다.

원격 지점 참조 / 원격 / 원점 / dev를 추적하도록 지점 개발을 설정했습니다.
새로운 지점 "dev"로 전환

이제 개발자 브랜치에있을 때 "git pull"은 로컬 개발자를 원격 개발자 브랜치와 같은 지점으로 업데이트합니다. 모든 브랜치를 가져 오지만, 트리의 맨 위에있는 브랜치 만 가져옵니다.


14
여기에 심판 / 원격이 필요하지 않습니다. git checkout -b dev origin / dev는 정상적으로 작동합니다.
emk

3
이것은 항상 작동합니다 : git checkout -b newlocaldev --track origin/dev. 로컬 브랜치의 이름이 원격 브랜치와 같고 원격 브랜치의 이름이 까다 롭지 않은 경우을 생략 할 수 있습니다 -b newlocaldev. 기본으로 branch.autosetupmerge설정 설정 및라는 이름의 지역 지점이없는 가정 dev:이 두 명령은 같은 일을 할 수 git checkout -b dev origin/dev와 그냥 일반을 git checkout dev. 마지막으로, git checkout origin/dev새로운 브랜치를 만들지 않고 분리 된 HEAD 상태로 만듭니다.
dubiousjim

리모컨이 더 이상 존재하지 않지만 Git이 너무 어리석어 서 삭제 된 것을 확인하면 어떻게됩니까? 이것은 업데이트 한 것으로 가정하고 git branch -a이를 원격 브랜치로 계속 나열합니다.
jww

그리고 우리는 수십 개의 지점에 대해 이것을합니까?
JosephK

59

"git clone git : // location"을 수행하면 모든 브랜치와 태그가 페치됩니다.

원점 리모트라고 가정하고 특정 리모트 브랜치 위에서 작업하려면 :

git checkout -b branch origin/branchname

2
"모든 지점과 태그를 가져 왔습니다"라는 점에 유의하십시오. 나는 당신의 대답이 틀렸다는 것에 대해 언급하려고했지만, 나는 그것을 확인하고 발견했다. 어떤 방법으로, 당신은 가장 짧은 답변을 제공했습니다-당신이 복제하는 경우, 당신은 이미 있습니다. 좋은. $ git branch -a어떤 원격 브랜치가 이미 사용 가능한지 배우 려고 노력하십시오 .
Jan Vlcinsky

내가 게시 한 답변도 살펴보십시오. 많은 원격 브랜치에서 로컬로 작업하고 싶어하며 하나씩 체크 아웃하지 않아도되는 경우 유용합니다.
lacostenycoder

당신은 차이가 사이에 무엇을 나에게 설명 할 수 git checkout -b master origin/mastergit checkout --track origin/master하세요?
aderchox

1
@aderchox 요즘에는 아무 생각이 없습니다.
elmarco

58

별명을 사용하십시오. 기본 Git one-liner는 없지만 다음과 같이 정의 할 수 있습니다.

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

그런 다음

git clone-branches

감사. 이것은 다른 답변들과 달리 모든 원격 브랜치를 복제합니다.
FearlessHyena

50

왜 "마스터"만 보이는가

git clone파일이 새 저장소에 있더라도 모든 원격 브랜치를 다운로드하지만 여전히 "원격"으로 간주합니다. 이에 대한 한 가지 예외가 있습니다. 복제 프로세스는 "master"라는 원격 지점에서 "master"라는 로컬 지점을 만듭니다. 기본적으로 git branch로컬 지점 만 표시되므로 "마스터"만 표시됩니다.

git branch -a원격 브랜치를 포함한 모든 브랜치를 표시합니다 .


현지 지점을 얻는 방법

실제로 지점에서 작업하려면 "로컬"버전이 필요할 것입니다. 원격 브랜치에서 로컬 브랜치를 만들려면 (이를 체크 아웃하지 않고 작업 디렉토리의 내용을 변경하지 않고) 다음과 같이 할 수 있습니다.

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

이 예에서 branchone작성하는 로컬 브랜치의 이름입니다 origin/branchone. 다른 이름으로 로컬 브랜치를 만들려면 다음을 수행하십시오.

git branch localbranchname origin/branchone

로컬 지점을 만든 후에는 지점을 볼 수 있습니다 git branch( -a로컬 지점을 볼 필요는 없습니다 ).


origin/branchone존재하는 경우 git checkout branchone동일한 이름으로 로컬 브랜치를 만들고 원격을 추적하도록 설정할 수도 있습니다.
에반

47

이것은 너무 복잡하지 않고 매우 간단하고 간단한 단계는 다음과 같습니다.

git fetch origin 이렇게하면 모든 원격 지점이 로컬로 가져옵니다.

git branch -a 모든 원격 브랜치가 표시됩니다.

git checkout --track origin/<branch you want to checkout>

다음 명령으로 원하는 분기에 있는지 확인하십시오.

git branch

출력은 다음과 같습니다.

*your current branch 
some branch2
some branch3 

현재 분기를 나타내는 * 기호를 확인하십시오.


1
감사합니다. 그 이유는 그다지 투표되지 않았기 때문입니다. 그리고 대답은 질문자에 의해 받아 들여지지 않습니다.
Sam

"git fetch origin"은 원격 브랜치를 내 로컬로 가져 오지 않았습니까? 아니면 어딘가에 숨겨져 있습니까? 위의 모든 답변을 읽으면 두통이 생겼습니다. "git 모든 지점을 로컬로 가져 오기"를 찾고 있습니다. 이를 위해 bash-scripts를 제외하고 방법이 있어야합니다.
JosephK

1
"git fetch origin"을 실행 한 직후에는 터미널에 "* [new branch] branch_name-> origin / branch_name"과 같은 출력이 표시되지만 "git branch"를 실행하면 로컬에만 표시됩니다. 대신 모든 분기를 보려면 "git branch -a"를 수행 한 다음 원격 분기로 전환하려면 "git checkout --track origin / <점점하려는 분기>"를 실행해야합니다. 도움이 되었기를 바랍니다. :-)
Sam

4
Suraj는 한 번에 하나씩 수동으로 업데이트하는 방법이 아니라 "모든 원격 브랜치 복제"방법에 대한 의문이 있었기 때문입니다. 실제 질문에 대한 답변이없는 것처럼 보입니다. 분기가 많은 경우 타이핑을 많이하는 방법입니다.
JosephK

47

결코 늦지 않는 것이 낫지 만 여기에 가장 좋은 방법이 있습니다.

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

이 시점에서 모든 브랜치가있는 원격 저장소의 전체 사본이 있습니다 (로 확인하십시오 git branch). 원격 저장소에 자체 리모컨이있는 경우 --mirror대신 사용할 수 있습니다 --bare.


여기 편집 중에 문제가 발생했습니다. 이제이 대답은 의미가 없습니다. --bare마지막 문장에서 언급 한 " "이 (가) 주어진 명령 목록에 없습니다.
Cerran

아래 Dave의 답변에서 가져옵니다. 'git config unset core.bare'대신 'git config --bool core.bare false'를 사용하면 작업을 수행하는 것 같습니다.
혼란스러운 Vorlon

나는 error: key does not contain a section: unset. 데이브의 대답은 잘 작동합니다.
olibre

그건 git config --unset core.bare사실 ... 나에게,이 대답을 여기에 제시되는 모든의 깨끗한 솔루션을 보인다. 그렇게 몇 upvotes이있는 연민 ...
더크 Hillbrecht

1
감사합니다 @ChrisSim 동의합니다 git config --bool core.bare false. 이것이 대신 Dave의 답변을 추천하는 이유 입니다. Dave의 답변 에 대해 어떻게 생각 하십니까? 건배
올리버

39

그냥 이렇게 :

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

'git clone git : //example.com/myprojectt'는 브랜치를 포함하여 모든 것을 가져오고 체크 아웃하면 로컬 브랜치가 생성됩니다.


25

모든 분기를 가져 오려면 "git clone"만 사용하면됩니다.

git clone <your_http_url>

마스터 브랜치 만 보더라도 "git branch -a"를 사용하여 모든 브랜치를 볼 수 있습니다.

git branch -a

이미 가지고있는 지점으로 전환 할 수 있습니다.

git checkout <your_branch_name>

"git clone"후에 원격 저장소에 연결할 필요가 없습니다. Wi-Fi를 닫을 때 "git branch -a"및 "git checkout"을 성공적으로 실행할 수 있습니다. 따라서 "git clone"을 수행하면 이미 원격 저장소에서 모든 분기를 복사 한 것으로 판명되었습니다. 그 후에는 원격 저장소가 필요하지 않으며 로컬에는 이미 모든 지점 코드가 있습니다.


여기에 매우 명확한 답변입니다. 이 주제에 대해 많은 사람들이 혼란스러워했습니다.
XMAN

"Wi-Fi를 닫으면 성공적으로 실행될 수 있습니다"라는 문구를 두 번째로 말씀 드리고 싶습니다. "git clone"은 실제로 모든 브랜치를 포함하는 저장소를 생성합니다.
bvgheluwe 2013

대단한 대답입니다.
Amr

24

A git clone는 전체 저장소를 복사해야합니다. 복제를 시도한 다음를 실행하십시오 git branch -a. 모든 가지를 나열해야합니다. "master"대신 "foo"분기로 전환하려면을 사용하십시오 git checkout foo.


1
하이픈을 사용하거나 사용하지 않고 git 명령을 실행할 수 있습니다. "git-branch"와 "git branch"는 모두 작동합니다.
피터 Boughton

21
어쩌면이 대답은 오래 전 git이 다르게 작동했을 때 주어졌지만 오늘 오해의 소지가 있다고 생각합니다. git clone모든 원격 브랜치를 다운로드하지만 마스터의 로컬 브랜치를 만듭니다. git branch로컬 브랜치 만 표시 하므로 git branch -a원격 브랜치도 표시 해야 합니다.
Cerran

감사합니다. 이것은 이상한 기본 동작 IMO입니다. 나는 좀 더 비밀스런 진부함을 위해 그것을 분필로 만들 것입니다. 분기를 다운로드 한 경우 왜 git branch를 호출 할 때 분기를 숨기겠습니까?
Adam Hughes

1
@Cerran, 감사합니다; 이에 따라 답변을 업데이트했습니다.
MattoxBeckman

"모든 원격 브랜치를 다운로드하지만 마스터의 로컬 브랜치 만 만듭니다". 이것을 이해하는 데 도움이 필요합니다. git clone은 master를 제외한 모든 브랜치를 복제하지 않는 것 같습니다. "git branch -a"를 수행 할 때 "develop"브랜치가 "remotes / origin / develop"에만 있음을 보여줍니다. 이것은 당신 이이 지점을 로컬로 가지고 있지 않다는 것을 말해야합니다. 현재 지점에만 존재합니까?
John Little

19

내 도구 git_remote_branch를 사용하십시오 (시스템에 Ruby가 설치되어 있어야 함). 원격 브랜치 조작을 쉽게하기 위해 특별히 제작되었습니다.

사용자를 대신하여 작업을 수행 할 때마다 콘솔에서 빨간색으로 인쇄됩니다. 시간이 지남에 따라 그들은 마침내 당신의 두뇌에 달라 붙습니다.

grb가 사용자 대신 명령을 실행하지 못하게하려면 'explain'기능을 사용하십시오. 명령이 실행되는 대신 콘솔에 인쇄됩니다.

마지막으로, 모든 명령에는 더 쉽게 기억할 수 있도록 별칭이 있습니다.

이것은 알파 소프트웨어입니다 ;-)

grb help를 실행할 때의 도움말은 다음과 같습니다.

git_remote_branch 버전 0.2.6

  용법:

  grb는 branch_name을 만듭니다 [origin_server] 

  grb publish branch_name [origin_server] 

  grb 이름 바꾸기 branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb 트랙 branch_name [origin_server] 



  노트:
  -origin_server를 지정하지 않으면 'origin'이라는 이름이 사용됩니다. 
    (git의 기본값)
  -이름 바꾸기 기능은 현재 지점의 이름을 바꿉니다.

  Explain 메타 명령 : 
키워드 '설명'. git_remote_branch 명령을 실행하는 대신
단순히 수행하기 위해 실행해야하는 명령 목록을 출력합니다. 
그 목표.

  예: 
    grb 설명 작성
    grb 설명 my_branch github 생성

  모든 명령에는 별칭이 있습니다.
  작성 : 새로 작성
  삭제 : 삭제, 파괴, 죽이기, 제거, rm
  게시 : 게시, remotize
  이름 바꾸기 : 이름 바꾸기, rn, mv, 이동
  추적 : 추적, 팔로우, 잡기, 가져 오기

6
현명한 말 :이 답변이 게시 된 시점에이 프로젝트가 중단 된 것 같습니다. 2008 년 이후에는 어떤 업데이트도 찾을 수 없습니다. 내가 틀렸다면 누군가가 편집하고 현재 포인터를 제공하기를 바랍니다. 왜냐하면 나는이 편리한 도구를 원하기 때문입니다.
bradheintz

: @bradheintz이 답변을 확인,이 자식 별칭 설정 stackoverflow.com/a/16563327/151841
user151841

19

내가 본 모든 대답은 유효하지만 저장소를 복제하고 한 번에 모든 가지를 끌어내는 훨씬 깨끗한 방법이 있습니다.

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

$ 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 폴더 만 있습니다.

  1. 두번째 단계

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

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

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

$ git reset --hard

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

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


한 번에 하나씩 "다운로드"라는 단어에서 "다운로드"라는 단어를 사용하는 것이 마음에 들지 않습니다 . 실제로 모든 정보는 리포지토리를 복제 한 후에 이미 다운로드됩니다. 로컬 추적 분기 (오프라인 상태에서도 가능하며 모든 정보가 저장소에 있음을 증명할 수 있음)를 작성하는 것이 유일합니다.
bvgheluwe 2013

@bvgheluwe 그것이 따옴표 안에있는 이유입니다.
FedericoCapaldo

15

로컬 리포지토리에서 복제하면 git clone & git fetch에서 작동하지 않습니다. 많은 분기 / 태그가 페치되지 않은 상태로 남아 있습니다.

모든 브랜치 및 태그가있는 복제본을 가져옵니다.

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

모든 브랜치 및 태그와 함께 작업 복사본으로 복제본을 얻으려면 :

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

13

좋아, 레포를 복제하면 거기에 모든 가지가 있습니다 ...

당신이 방금하면 git branch, 그들은 숨겨져 있습니다 ...

따라서 모든 지점 이름을 보려면 다음과 같이 --all플래그 를 추가 하십시오.

git branch --all 또는 git branch -a

지점에 체크 아웃하면 필요한 모든 것을 얻을 수 있습니다.

그러나 복제 후 다른 사람이 만든 분기는 어떻습니까?

이 경우 다음을 수행하십시오.

git fetch

모든 지점을 다시 확인하십시오.

동시에 페치 및 체크 아웃하려는 경우 다음을 수행 할 수 있습니다.

git fetch && git checkout your_branch_name

또한 내가 말한 것을 단순화하기 위해 아래 이미지를 만들었습니다.

자식 분기-모든 분기를 가져옵니다.


3
"본다"와 "본다"는 차이가 있습니다. git branch -all은 원격 저장소를 제거 할 때 더 이상 원격 분기를 나열하지 않습니다.
Gustave

12

질문에 대한 답변 중 하나를 살펴보면 단축 할 수 있음을 알았습니다.

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

그러나 원격 브랜치 중 하나의 이름이 admin_master로 지정되면 다운로드되지 않습니다.

독창적 인 아이디어를위한 bigfish 덕분에


grep잘못된 긍정을 피하기 위해 필터를 개선하기 위해 정규 표현식을 개선하거나 대신 Awk를 사용할 수 있습니다 .
tripleee

모든 지점은 'origin \ my_branch_name'이며, 내가 원하는 것은 아닙니다.
Sнаđошƒӽ ӽ

전에 $ {branch ## * /} 구문을 보지 못했습니다. 정말 유용 해 보입니다. 더 자세한 정보를 얻을 수있는 아이디어가 있습니까? 어디서나 bash에서 찾을 수없는 것 같습니다. 고마워.
SaminOz


10

명령 행에 복사하여 붙여 넣기 :

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 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


이것은 :

  1. 마스터 체크 아웃 (우리가있는 지점을 삭제할 수 있도록)
  2. 원격 선택체크 아웃 을 으로 변경하십시오)
  3. 모든 가지를 돌다마스터 및 HEAD를 제외한 원격 를
    1. 지우다로컬 분기 (강제 업데이트 된 분기를 확인할 수 있도록)
    2. 리모컨에서 지점을 확인하십시오
  4. 마스터 확인 (그것을 위해)

VonC의 답변 을 기반으로 합니다.


10

나는이 작은 Powershell 함수를 작성 하여 원점 원격에있는 모든 자식 분기를 체크 아웃 할 수있었습니다.

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

내 자식 설정 저장소 에서 더 많은 자식 기능을 찾을 수 있습니다


9

다음은 awk를 사용하는 답변입니다. 이 방법은 새로운 저장소에 사용하면 충분합니다.

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

기존 브랜치는 단순히 체크 아웃되거나 이미 이미 선언되어 있지만 충돌을 피하기 위해 필터를 추가 할 수 있습니다.

또한 명시 적으로 호출되도록 수정할 수도 있습니다. git checkout -b <branch> -t <remote>/<branch> 명령을 .

이 답변은 Nikos C.아이디어를 따릅니다 .


또는 대신 원격 브랜치를 지정할 수 있습니다. 이것은 murphytalk답변을 기반으로 합니다.

git branch -r | awk '{ system("git checkout -t " $NF) }'

충돌시 치명적인 오류 메시지가 표시되지만 무해합니다.


두 명령 모두 별명을 지정할 수 있습니다.

nobody답변 을 참조로 사용 하여 다음 명령을 사용하여 별칭을 만들 수 있습니다.

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

개인적으로 track-all또는을 사용 track-all-branches합니다.


그냥 감사하고 싶었어 이것은 완벽하게 작동하며 풀 동작 변경 등과 같은 베어 레포 복제와 관련된 다양한 문제를 겪지 않습니다.
mahonya

8

나는 정확히 똑같이해야했습니다. 여기 내 루비 스크립트가 있습니다.

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]

이 스크립트를 전혀 실행하지 않으려면 추가로 게시 한 답변을 참조하십시오.
lacostenycoder

8

사용자가 올바른 길을 가고 있지 않다는 것을 제외하고는 이러한 답변 중 어느 것도 그것을 버리지 못했습니다.

한 서버 / 시스템에서 다른 서버로 리포지를 이동하는 데 문제가있었습니다. 리포지토리를 복제 할 때 마스터에 대한 로컬 분기 만 만들었으므로 새 원격으로 푸시하면 마스터 분기 만 푸시되었습니다.

그래서이 두 가지 방법이 매우 유용하다는 것을 알았습니다. 그들이 다른 사람을 돕기를 바랍니다.

방법 1 :

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

방법 2 :

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

8

git clone --mirror 원래 repo 에서이 작업을 수행하는 것이 좋습니다.

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin

7

힘내 (일반적으로 지정되지 않은 경우) git ls-refs는 기록을 완료하는 데 필요한 객체와 함께 하나 이상의 다른 저장소에서 모든 분기 및 / 또는 태그 (참조 : 참조)를 가져옵니다 . 즉, 이미 다운로드 한 객체가 접근 할 수있는 객체를 가져옵니다. 무엇을 참조하십시오git fetch 실제로 합니까?

때로는 현재 분기에 직접 연결되지 않은 분기 / 태그가있을 수 있으므로 git pull --all/ git fetch --all는 도움이되지 않지만 다음과 같이 나열 할 수 있습니다.

git ls-remote -h -t origin

참조 이름을 알고 수동으로 가져옵니다.

그래서하는 그들 모두를 가져 , 시도 :

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

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

그런 다음 모든 지점을 다시 확인하십시오.

git branch -avv

위의 방법으로도 도움이되지 않으면 누락 된 분기를 추적 목록에 수동으로 추가해야합니다 (어쨌든 손실 됨).

$ git remote -v show origin
...
  Remote branches:
    master      tracked

으로 git remote set-branches같은 :

git remote set-branches --add origin missing_branch

remotes/origin가져온 후 아래에 나타날 수 있습니다 .

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

문제 해결

여전히 마스터 브랜치 이외의 것을 얻을 수 없으면 다음을 확인하십시오.

  • 리모컨을 다시 확인하십시오 ( git remote -v). 예 :
    • 유효성 검사가 git config branch.master.remote있습니다 origin.
    • 다음을 origin통해 올바른 URL을 가리키는 지 확인 git remote show origin하십시오 (이 게시물 참조 ).

7

2017 년 초 현재이 의견 의 답변 은 다음 과 같습니다.

git fetch <origin-name> <branch-name>당신을 위해 지점을 가져옵니다. 이것이 모든 분기를 한 번에 가져 오는 것은 아니지만 분기별로이 분기를 개별적으로 실행할 수 있습니다.


이를 위해서는 한 번에 하나씩 각 분기를 가져와야합니다. 가지가 많으면 좋지 않습니다.
lacostenycoder

6

다음은 모든 원격 브랜치에 대한 로컬 브랜치를 만드는 또 다른 짧은 한 줄 명령입니다.

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

로컬 지점 추적이 이미 생성 된 경우에도 올바르게 작동합니다. 당신은 첫 번째 후 그것을 호출 할 수 있습니다git clone 또는 나중에 나중에 .

master복제 후 지점을 체크 아웃 하지 않아도되는 경우

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.