하므로 Git의 모든 원격 분기를 복제하는 방법은 무엇입니까?




리모트 head 가 없는 레퍼런스 를 참고 하므로 체크 아웃 할 수 없습니다 (24)

나는 masterdevelopment branch를 가지고 있는데, 둘 다 GitHub push했다. 나는 clone 하고 에드를 fetch 왔지만 에드를 fetch 왔지만 master 브랜치 이외의 것을 얻을 수 없다.

나는 명백한 것을 놓치고 있다고 확신하지만, 매뉴얼을 읽었고 전혀 기쁨을 얻지 못하고있다.


필자는이 작은 Powershell 함수를 작성하여 원격으로 원점에있는 모든 git 브랜치를 체크 아웃 할 수있게했습니다.

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>' #>
}

더 많은 자식 기능은 나의 자식 설정 repo 에서 찾을 수 있습니다.


왜 당신은 "마스터"

git clone 모든 원격 원격 브랜치를 다운로드하지만 파일이 새 저장소에 있더라도 여전히 "원격"으로 간주합니다. 복제 프로세스가 "master"라는 원격 지점에서 "master"라는 로컬 분기를 만드는 경우를 제외하고는 예외입니다. 기본적으로 git branch 는 로컬 git branch 만을 보여주기 때문에 "마스터"만 볼 수있다.

git branch -a원격 브랜치를 포함한 모든 브랜치를 보여준다.

지역 지점을 얻는 방법

실제로 지사에서 작업하고 싶다면 아마도 "로컬"버전을 원할 것입니다. 원격 브랜치에서 로컬 브랜치를 간단히 만들기 위해 (체크 아웃하지 않고 작업 디렉토리의 내용을 변경하지 않고) 다음과 같이 할 수 있습니다 :

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

이 예에서 branchoneorigin/branchone 기반으로 작성중인 로컬 분기의 이름입니다. 다른 이름으로 로컬 브랜치를 만들고 싶다면 다음과 같이하면된다 :

git branch localbranchname origin/branchone

로컬 브랜치를 만들었 으면 git branch 로 볼 수 있습니다 (로컬 브랜치를보기 위해 -a 가 필요하지 않음을 기억하십시오).


이 답변 중 어느 것도 사용자를 제외하고는 잘리지 않습니다.

한 서버 / 시스템에서 다른 서버 / 시스템으로 리포를 이동하는 데 문제가있었습니다. 내가 repo를 복제 할 때 마스터에 대한 로컬 브랜치 만 생성 했으므로 새 리모컨으로 밀어 넣을 때 마스터 브랜치 만 푸시되었습니다.

그래서 저는이 두 가지 방법이 매우 유용하다는 것을 알았습니다. 희망 그들은 다른 사람을 도웁니다.

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

내 도구 git_remote_branch 사용하십시오 (Ruby가 컴퓨터에 설치되어 있어야합니다). 원격 지점 조작을 쉽게 처리 할 수 ​​있도록 특별히 제작되었습니다.

사용자를 대신하여 작업을 수행 할 때마다 콘솔에서 빨간색으로 인쇄합니다. 시간이 지남에 따라 마침내 두뇌에 집중하게됩니다.

grb에서 사용자를 대신하여 명령을 실행하지 않으려면 '설명'기능 만 사용하십시오. 명령은 실행되지 않고 콘솔에 인쇄됩니다.

마지막으로, 모든 명령에는 별명이있어 암기를 쉽게합니다.

이것은 git_remote_branch ;-)

grb 도움말을 실행할 때 도움이됩니다.

git_remote_branch version 0.2.6

  Usage:

  grb create branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb rename branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Notes:
  - If origin_server is not specified, the name 'origin' is assumed 
    (git's default)
  - The rename functionality renames the current branch

  The explain meta-command: you can also prepend any command with the 
keyword 'explain'. Instead of executing the command, git_remote_branch 
will simply output the list of commands you need to run to accomplish 
that goal.

  Example: 
    grb explain create
    grb explain create my_branch github

  All commands also have aliases:
  create: create, new
  delete: delete, destroy, kill, remove, rm
  publish: publish, remotize
  rename: rename, rn, mv, move
  track: track, follow, grab, fetch

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

여기서 본 모든 대답은 유효하지만 저장소를 복제하고 모든 지점을 한 번에 가져 오는 훨씬 더 깨끗한 방법이 있습니다.

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

$ 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 구성의 부울 값 "bare"를 false로 전환하여이 저장소를 빈 (베어) 저장소에서 일반 저장소로 전환하십시오.

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

현재 폴더 안에있는 모든 것을 가져 와서 로컬 컴퓨터의 모든 브랜치를 생성합니다. 따라서 이것은 정상적인 repo가됩니다.

$ git reset --hard

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

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


그냥 이렇게해라.

$ 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'가 모든 것을 가져오고, 심지어 브랜치를 체크 아웃하기 만하면 로컬 브랜치가 생성됩니다.


"git clone"만 사용하여 모든 브랜치를 가져와야합니다.

git clone <your_http_url>

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

git branch -a

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

git checkout <your_branch_name>

"git clone"후에 원격 저장소에 연결할 필요가 없다는 점에 대해 걱정하지 마십시오. wifi를 닫을 때 "git branch -a"및 "git checkout"이 성공적으로 실행될 수 있습니다. 따라서 "복제본"을 사용하면 이미 원격 저장소의 모든 분기가 복사 된 것으로 증명됩니다. 그 후, 당신은 원격 저장소가 필요하지 않습니다, 당신의 지역은 이미 모든 지점의 코드가 있습니다.


명령 줄에 복사 - 붙여 넣기 :

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 answer 을 기반으로합니다.


질문에 대한 답변 중 하나를 살펴보면 단축 할 수있는 것으로 나타났습니다.

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

그러나 원격 지점 중 하나가 예를 들어 admin_master로 명명 된 경우 다운로드되지 않습니다!

원래 생각에 대한 bigfish 덕분에


#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

이 코드는 모든 원격 지점 코드를 로컬 저장소로 가져옵니다.


기억할 수있는 명령어를 사용하십시오.

Atlassian의 Repository Hosting Service 인 Bitbucket을 사용하고 있습니다. 그래서 나는 그들의 문서를 따르려고 노력한다. 그리고 저것은 저를 위해 완벽하게 작동합니다. 다음의 쉽고 간단한 명령을 사용하여 원격 지점을 체크 아웃 할 수 있습니다.

먼저 저장소를 복제 한 다음 대상 폴더로 변경하십시오. 마지막으로 중요한 것은 가져 오기 및 체크 아웃입니다.

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

그게 전부 야. 여기 litte 더 현실적인 예 :

git clone https://[email protected]/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

당신은 문서의 명령에 대한 자세한 정보를 찾을 수 있습니다 : 복제 명령 , 명령 가져 오기 , 체크 아웃 명령


별칭을 사용하십시오. 네이티브 Git one-liners는 없지만,

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

이것은 너무 복잡하지 않으며, 매우 간단하고 직선적 인 단계는 다음과 같습니다.

git fetch origin 그러면 모든 원격 브랜치가 로컬로 전달됩니다.

git branch -a 이것은 모든 원격 브랜치를 보여줍니다.

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

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

git branch

출력은 다음과 같습니다.

*your current branch 
some branch2
some branch3 

현재 분기를 나타내는 * 기호에 주목하십시오.


2017 년 초 현재이 주석 의 대답 은 다음 과 같습니다.

git fetch <origin-name> <branch-name>너를 위해 지부를 가져온다. 이렇게하면 모든 분기를 한 번에 가져 오지는 않지만이 분기마다이 분기를 개별적으로 실행할 수 있습니다.



Git은 (지정되지 않은 경우) 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매개 변수는 저장소를 얕게 만든 경우 도움이 될 수 있습니다.

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

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.
    • 다음 originURL을 통해 올바른 URL을 가리키는 지 확인 git remote show origin하십시오 (이 post 참조 ).

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 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 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 유니버스를 복사하기 전에 설정을 테스트하십시오.

한 줄짜리 크레딧은 사용자 cfi로 이동합니다.


에 관해서,

$ git checkout -b 실험적 출발점 / 실험실

~을 사용하여

$ git checkout -t origin/experimental

또는 좀더 자세한하지만 기억하기 쉽도록

$ git checkout --track origin/experimental

원격 저장소를 추적하는 측면에서 더 좋을 수도 있습니다.


한 번에 가져올 원격 브랜치가 여러 개있는 경우 다음을 수행하십시오.

$ git pull --all

이제 원격 저장소를 사용하지 않고 필요한 모든 지점을 체크 아웃 할 수 있습니다.


나는 똑같이해야했다. 여기 내 Ruby 스크립트입니다.

#!/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]

가져 오는 작업은 모든 원격 브랜치를 가져와야하지만 로컬 브랜치는 생성하지 않습니다. gitk를 사용한다면 원격 브랜치가 "remotes / origin / dev"또는 비슷한 것으로 기술되어 있어야한다.

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

git checkout -b dev refs/remotes/origin/dev

다음과 같이 반환해야합니다.

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

dev 브랜치에있을 때, "git pull"은 로컬 dev를 원격 dev 브랜치와 같은 포인트로 업데이트 할 것입니다. 그것은 모든 브랜치들을 페치 할 것이지만, 오직 당신이있는 브랜치를 트리의 맨 위로 잡아 당길뿐입니다.


다음은 모든 원격 브랜치에 대한 로컬 브랜치를 생성하는 또 다른 짧은 1 회선 명령입니다.

(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

좋아요, 당신이 당신의 레포를 복제하면, 당신은 거기에 모든 가지를 가지고 있습니다 ...

git branch 수행한다면 숨겨진 것입니다.

그래서 모든 브랜치의 이름을보고 싶다면 --all 플래그를 다음과 같이 추가하면됩니다 :

git branch --all 또는 git branch -a

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

하지만 복제 한 후에 다른 누군가가 만든 지사가 있다면 어떨까요?

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

git fetch

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

동시에 가져오고 체크 아웃하려는 경우 다음을 수행 할 수 있습니다.

git fetch && git checkout your_branch_name

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





remote-branch