Git에서 단일 브랜치를 어떻게 복제합니까?


799

프로젝트 스켈레톤을 저장하는 데 사용하는 'skeleton'이라는 로컬 Git 저장소가 있습니다. 다양한 종류의 프로젝트를 위해 몇 가지 지점이 있습니다.

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

새 프로젝트의 마스터 브랜치를 확인하려면 할 수 있습니다

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

모든 것이 내가 원하는 방식입니다. 특히, 새로운 마스터 브랜치는 스켈레톤 마스터 브랜치를 가리키며, 기본 프로젝트 설정의 변경 사항을 밀고 당겨서 이동할 수 있습니다.

그러나 작동하지 않는 것은 다른 지점을 복제하려는 경우입니다. 원하는 분기 (예 : rails분기) 만 master가져 와서 새 저장소 rails에 기본적으로 골격 저장소의 분기로 푸시 및 가져 오는 분기가 있습니다.

이 작업을 수행하는 좋은 방법이 있습니까? 또는 아마도 이것이 Git이 내가 물건을 구조화하기를 원하는 방식이 아닐 수도 있습니다. 아마도 Ruby on Rails 스켈레톤 저장소가 마스터 스켈레톤 저장소를 추적하면서 여러 저장소가 있어야합니까? 그리고 Ruby on Rails 스켈레톤 저장소를 복제하는 모든 개별 프로젝트.


무엇을 git branch -a보여줍니까?
Jakub Narębski 10

3
겠습니까이 git checkout -b newbranch origin/branchiwant더 잘 작동? ( --track옵션 없이 )
VonC

3
나는 당신이하려는 일이 나쁜 생각이라고 생각합니다. 프로젝트마다 다른 저장소를 사용하십시오. 가지가 완전히 다른 것입니다.
innaM

@Manni, git이 내가하고있는 일을 좋아하지 않기 때문에 일종의 생각이었습니다. 이유를 설명 할 수 있습니까? 가지가 오래 살지 않아야하기 때문입니까?
Casey Rodarmor

1
@ rodarmor 나는 당신이하려고하는 것이 좋은 생각이라고 생각하며, 나는 정확하게이 질문을 가지고 있습니다.
Paul Du Bois 2016 년

답변:


863

참고 : git1.7.10 (2012 년 4 월)에서는 실제로 하나의 분기 만 복제 할 수 있습니다 .

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

당신은 그것을 볼 수 있습니다 t5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

토부 의견 이 :

얕은 복제를 수행 할 때 암시 적입니다.
이것은 git clone --depth 1대역폭을 절약하는 가장 쉬운 방법입니다.

그리고 Git 1.9.0 (2014 년 2 월) 이후 얕은 클론은 데이터 전송 (푸시 / 풀)을 지원하므로 옵션이 훨씬 유용합니다.
더 "에서 참조 git clone --depth 1(얕은 클론)은 밖으로 만드는 것보다 더 유용? ".


얕은 클론 "실행 취소"는 " 얕은 클론을 전체 클론으로 변환 "(git 1.8.3+)에 자세히 설명되어 있습니다.

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

Chris는 다음과 같이 말합니다.

누락 된 분기를 되 --single-branch돌리는 마술 줄 은 (git v2.1.4)입니다.

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

Git 2.26 (Q1 2020)에서 " git clone --recurse-submodules --single-branch"는 이제 서브 모듈을 복제 할 때 동일한 단일 분기 옵션을 사용합니다 .

Emily Shaffer ( )의 commit 132f600 , commit 4731957 (2020 년 2 월 21 일)을 참조하십시오 . (가 합병 - Junio C 하마노 -b22db26 커밋 2020 3월 5일)nasamuffin
gitster

clone: --recurse-submodules 동안 --single-branch를 전달합니다

에 의해 서명 : 에밀리 셰퍼
Acked-by : 제프 킹

이전에는 " git clone --recurse-submodules --single-branch"을 수행 하면 수퍼 프로젝트가 하나의 분기 만 복제하더라도 하위 모듈이 모든 분기를 복제했습니다.

--single-branch하위 모듈 헬퍼 프레임 워크를 통해 파이프 하여 clone나중에 ' ' 로 만듭니다 .


80
git clone <url> --branch <branch> --single-branch <folder>매력처럼 작동합니다.
Alexander

1
그래, 내가 허용 대답을 업데이트하는 그것의 시간이 :)이 "마법 같은 일"않습니다 생각
kumarharsh

5
또한 얕은 복제를 수행 할 때 암시 적입니다. 이것은 clone --depth 1대역폭을 절약하는 가장 쉬운 방법입니다.
Tobu

1
@Tobu와 VonC --depth 1는 사용자가 실제로 새 클론으로 푸시 / 풀을 원할 수 있기 때문에 안전하지 않습니다.
nmr

2
Peter Cordes의 수정 사항을 완전히 설명하기 위해 누락 된 분기를 되 돌리는 마술 줄 --single-branch은 다음 git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*과 같습니다 git fetch --unshallow(git v2.1.4)
Chris

670

한 가지 방법은 다음을 실행하는 것입니다.

git clone user@git-server:project_name.git -b branch_name /your/folder

branch_name선택한 지점은 어디에 있고 "/ your / folder"는 해당 지점의 대상 폴더입니다. 이것은 다른 지점을 가져 와서 합병 할 수있는 기회를 제공한다는 것은 사실입니다.

최신 정보

이제 Git 1.7.10부터 시작하면됩니다.

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder

36
이것은 작동하지만 모든 분기를 가져옵니다 . 아래의 @ frerich = raabe의 답변을 참조하십시오.
cdunn2001

3
감사합니다. 내 경우에는 "-b branch_name"만 추가하십시오. 시간이 많이 절약되었습니다.
PhatHV

예, 완벽하게 작동합니다 ...! 나는 더 많은 TFS 사람이며 내 개인 프로젝트에는 git을 사용하고 있습니다. Wrto git branching, 나는 이전에 잘못된 방법을하고 있었고이 쉬운 방법을 알고 있으면 좋으며 완벽 해 보입니다! 다시 감사합니다! 이미 +1했습니다. 가능하다면 +100을 줄 것입니다 :)
k25

11
--single-branch리포지토리에 포함 된 모든 기록 및 태그 대신이 분기와 관련된 기록 만 가져 오도록 추가 할 수도 있습니다.
flawyte

1
@AlexNolasco / some / folder 란 무엇입니까? 감사합니다
Nabin

112

Git 버전 1.7.3.1 (Windows)을 사용하면 다음과 같은 작업을 수행 할 수 있습니다 ( $BRANCH체크 아웃하려는 지점의 이름이며 $REMOTE_REPO복제하려는 원격 저장소의 URL 임).

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

이 방법의 장점은 후속 git pull(또는 git fetch) 호출도 요청 된 분기를 다운로드한다는 것입니다.


스크립트와이 줄의 차이점은 무엇입니까? git clone -b $BRANCH $REMOTE_REPO $BRANCH그들은 동일하다?
Ian Vaughan

12
@Ian : 한 가지 차이점은 쇼 git clone -b와 같이 모든 원격 참조 (모든 원격 브랜치 및 태그) 를 제공 한다는 것 git branch -a입니다. 내 스크립트를 사용하면 하나의 심판을 얻습니다.
Frerich Raabe

1
위의 시도를하면 (예 : $ BRANCH = "nick") '치명적 : 원격 참조 참조 / 헤드 / 닉을 찾을 수 없습니다'. 나를 위해 작동하지 않는 것 같습니다 ...
Nick

3
참고 -t $BRANCH도없이 작동 -f즉시 가져올 것입니다. 그런 다음 git fetch origin페치 git checkout $BRANCH하여 로컬 브랜치 및 체크 아웃을 설정합니다. 가져 오기 전에 리모콘을 구성해야 할 때 유용합니다 (예 :) git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001

1
"오래된"회사 git (1.6.0.2)을 사용하고 있으므로 위의 솔루션에 묶여 있습니다. @Nick과 같은 문제가있었습니다. 자식 실행을 branch -a보여 주었다 origin/$BRANCH. 일 git checkout origin/$BRANCH이 해결되었습니다.
dr jerry

30

오래 걸리는 방법을 시도해 볼 수 있습니다.

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

이것이하는 일은 :

  • 빈 Git 저장소를 작성하고 초기화하십시오.
  • 원래 저장소를 origin 이라는 원격으로 추가합니다 .
  • remote라는 origin 에서 필요한 브랜치 만 가져옵니다 .
  • 방금 복제 한 소스 분기를 추적하도록 설정된 새 분기를 작성하고 체크 아웃합니다.

잘만되면 그것은 당신과 같은 것이 될 것입니다.


git remote add에 대한 인수가 바뀌었지만 체크 아웃을 할 수 없었습니다. "git checkout origin / rails"에서 "오류 : pathspec 'origin / rails'가 git로 알려진 파일과 일치하지 않습니다." 그리고 대안은 나에게 "치명적인 : git checkout : 경로 업데이트는 스위칭 브랜치와 호환되지 않습니다."
Casey Rodarmor

@rodarmor : git remote 명령을 수정했습니다. 감사합니다. 출력을 붙여 넣을 수 있습니까 git branch -r?
jkp

@jkp, 실제로 git branch -r출력이 없습니다.
Casey Rodarmor

@ rodarmor : 예제를 수정했으며 이것이 확실히 작동합니다 (테스트). HTH (당신이 좋아하면 그것을 테스트하면 받아 들일 수 있습니다.)
jkp

-b 스위치는 비교적 새롭습니다. 마지막으로 데비안 스퀴즈로 실행했을 때 사용할 수 없었습니다. IIRC
sehe

23

아래 명령을 사용하여 수행 할 수 있습니다.

git clone -b branch_name --single-branch project_url local_folder_to_clone_in

2
따라서 수동으로 한, 하나의 지점을 복제 소스 트리에 완벽하게, 내가 실제로 가지고 문제를 근무
azhar22k

17

에서 자식-복제 man 페이지 :

--single-branch복제 중 친구가 --branch <branch name>원격 기본 HEAD 와 함께 사용해야합니다 (기본적으로 마스터).

항상 캐시에서 소스가 아닌 새로운 소스를 읽으려면 Ctrl+ 를해야한다는 것을 기억하십시오 .-) F5(오랫동안이 옵션에 대해 몰랐습니다.)


1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari

17
git clone <url> --branch <branch> --single-branch

URL과 지점 이름을 입력하십시오.


8

하나의 지점 만 복제하십시오. 가장 쉬운 방법입니다.

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git

4

특정 지점을 복제하려면 다음을 수행하십시오.

git clone --branch yourBranchName git@yourRepository.git


3

Git의 브랜치를 복제하려면 공개 키가 없으므로 다음을 사용하십시오.

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>

2

cmd를여십시오.

cd folder_name (분기를 복제 할 경로를 입력하십시오)

하나의 명령 만 :

git clone url_of_projecturltoclone -b branch_name

2

조금 늦었지만이 문제를 해결하는 데 사용한 솔루션을 추가하고 싶었습니다. 여기 에서 해결책을 찾았습니다 .

어쨌든 문제는 '다른 리포지토리에서 새로운 프로젝트를 시작하는 방법'을 묻는 것 같습니다.

이를 위해 내가 사용한 솔루션은 먼저 github 또는 어디에서나 새로운 저장소를 만드는 것입니다. 이것은 새 프로젝트의 저장소 역할을합니다.

로컬 컴퓨터에서 새 프로젝트의 템플릿으로 사용할 분기가있는 프로젝트로 이동하십시오.

다음 명령을 실행하십시오 :

git push https://github.com/accountname/new-repo.git +old_branch:master

이 작업은 old_branch를 new-repo로 푸시하여 새 리포지토리의 마스터 분기로 만듭니다.

그런 다음 새 리포지토리를 새 프로젝트의 로컬 디렉토리로 복제하면 이전 브랜치에서 새 프로젝트가 시작됩니다.


2

플라스크 저장소의 예를 보자. 마스터 외에 3 개의 지점이 있습니다. 1.1.x 원격 브랜치를 체크 아웃하자

자식 저장소 복제

git clone https://github.com/pallets/flask

레포로 들어갑니다.

cd flask

원격 브랜치 1.1.x 가져 오기

git fetch origin 1.1.x

지점을 체크 아웃

git checkout 1.1.x

지점 1.1.x로 전환하면 원격 1.1.x 지점을 추적합니다.


0

@ nosaiba-darwish가 여기에 말한 것과 유사합니다 : here

이것이 우리 회사에서 일반적으로하는 일입니다.

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally


0

얕은 복제를 원하면 다음을 수행하십시오.

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1의미합니다 --single-branch.


0

이를 위해 주로 두 가지 솔루션이 있습니다.

  1. -b 명령 스위치를 사용하여 분기 이름을 지정해야합니다. 다음은 특정 자식 분기를 복제하는 명령의 구문입니다.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

예 : git clone -b tahir https://github.com/Repository/Project.git

다음 명령은 git 저장소에서 분기 tahir 를 복제 합니다. 위 명령은 특정 분기 만 복제하지만 다른 분기의 세부 정보는 가져옵니다. 명령을 사용하여 모든 분기 세부 사항을 볼 수 있습니다. git branch -a

  1. 당신이 사용할 수있는 '- 단일 지점' 아래 같은 다른 지점 가져 오는 세부 사항을 방지하기 위해 플래그를 :

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

예 : git clone -b tahir --single-branch https://github.com/Repository/Project.git

이제을 수행하면 git branch -a현재 분기가 복제 한 것이 아니라 모든 분기가 아닌 현재 단일 분기 만 표시되므로 원하는 방식에 따라 다릅니다.

언젠가 누군가를 돕기를 바랍니다! ...


0

분기를 독립적으로 유지하려면이 명령을 사용하여 단일 분기를 git하고 폴더의 이름을 바꿀 수 있습니다

git clone -b [branch-name] --single-branch [url]  [folder_name]

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch


-1

2 단계로 수행 가능

  1. 리포지토리 복제

    • git clone <http url>
  2. 원하는 지점을 확인하십시오

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