git - 오기 - 리모트 head 가 없는 레퍼런스 를 참고 하므로 체크 아웃 할 수 없습니다




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

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

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


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

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 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 가 필요하지 않음을 기억하십시오).


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


나는 똑같이해야했다. 여기 내 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]

늦지 않을 때보 다 나은데, 여기에이 일을하는 가장 좋은 방법이 있습니다.

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

이 시점에서 모든 원격 브랜치 ( git branch 확인)가있는 원격 저장소의 전체 복사본을 얻을 수 있습니다. 원격 저장소에 자체 원격이있는 경우 --mirror 대신 --mirror 를 사용할 수 있습니다.


먼저, 원격 Git 저장소를 복제하고 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'

그 마지막 줄은 어떤 사람들을 던졌습니다 : "새로운 지점"- 응? 이것이 실제로 의미하는 바는 해당 분기가 인덱스에서 가져와 로컬로 생성된다는 것입니다. 앞의 줄은 실제로 브랜치가 원격 브랜치를 추적하도록 설정되었다는 것을 알려주면서 더 유익하다. 보통 origin / 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 &

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

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


별칭을 사용하십시오. 네이티브 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 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 저장소를 한 번에 복제 할 수있는 빠른 방법이지만 모든 단일 프로젝트에서이 방법으로 수행하고자하는 것이 아닙니다.


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로 이동합니다.


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

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

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

원래 생각에 대한 bigfish 덕분에


필자는이 작은 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 은 전체 저장소를 복사해야합니다. 복제를 시도한 다음 git branch -a 를 실행하십시오. 모든 지점을 나열해야합니다. "master"대신 "foo"브랜치로 전환하려면 git checkout foo .


다음은 모든 원격 브랜치에 대한 로컬 브랜치를 생성하는 또 다른 짧은 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

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

한 서버 / 시스템에서 다른 서버 / 시스템으로 리포를 이동하는 데 문제가있었습니다. 내가 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은 (지정되지 않은 경우) 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 참조 ).

여기서 2 센트를 추가 할 것입니다. 왜냐하면 제가 로컬에서 삭제 한 원격 브랜치를 끌어 내려는 방법을 알아 내려고했기 때문입니다. 오리진은 내 것이 아니었고 모든 것을 다시 복제하는 번거 로움을 겪고 싶지 않았습니다.

이것은 나를 위해 일했다 :

로컬로 브랜치를 재 작성해야한다고 가정하십시오.

git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-origin/recreated-branch-name

그래서 gituser / master에서 sjp로 분기 한 다음 sjp / mynewbranch로 분기하면 다음과 같이 보입니다.

$ git checkout -b mynewbranch
$ git branch -a
  master
  remotes/sjp/master
  remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch




remote-branch