Làm cách nào để sao chép một nhánh duy nhất trong Git?


799

Tôi có một kho lưu trữ Git cục bộ gọi là 'bộ xương' mà tôi sử dụng để lưu trữ bộ xương dự án. Nó có một vài chi nhánh, cho các loại dự án khác nhau:

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

Nếu tôi muốn kiểm tra chi nhánh chính cho một dự án mới, tôi có thể làm

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

và tất cả mọi thứ là cách tôi muốn nó. Cụ thể, nhánh chủ mới chỉ vào nhánh chính của bộ xương và tôi có thể đẩy và kéo để di chuyển xung quanh các thay đổi đối với thiết lập dự án cơ bản.

Tuy nhiên, điều không hiệu quả là nếu tôi muốn sao chép một nhánh khác. Tôi không thể lấy nó để tôi chỉ kéo nhánh tôi muốn, ví dụ như railsnhánh, và sau đó kho lưu trữ mới có một masternhánh đẩy và kéo từ railsnhánh của kho lưu trữ theo mặc định.

Có một cách tốt để làm điều này? Hoặc, có lẽ đây không phải là cách mà Git muốn tôi cấu trúc mọi thứ, và tôi chắc chắn mở cho nó. Có lẽ tôi nên có nhiều kho lưu trữ, với kho lưu trữ bộ xương Ruby on Rails theo dõi kho lưu trữ bộ xương chính? Và bất kỳ dự án cá nhân nào nhân bản kho lưu trữ bộ xương Ruby on Rails.


Không git branch -athể hiện điều gì?
Jakub Narębski

3
Sẽ git checkout -b newbranch origin/branchiwantlàm việc tốt hơn? (không có --tracktùy chọn)
VonC

3
Tôi nghĩ những gì bạn đang cố gắng làm là có một ý tưởng tồi. Sử dụng các kho khác nhau cho các dự án khác nhau. Chi nhánh là một cái gì đó hoàn toàn khác nhau.
innaM

@Manni, tôi đã nghĩ rằng, vì git dường như không thích những gì tôi đang làm. Bạn có thể giải thích lý do tại sao? Có phải vì chi nhánh không nên sống lâu?
Casey Rodarmor

1
@rodarmor Tôi nghĩ những gì bạn đang cố gắng làm là có một ý tưởng tốt, và tôi đã có chính xác câu hỏi này.
Paul Du Bois

Câu trả lời:


863

Lưu ý: git1.7.10 (tháng 4 năm 2012) thực sự cho phép bạn chỉ sao chép một nhánh :

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

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

Bạn có thể thấy nó trong t5500-fetch-pack.sh:

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

Tobu bình luận rằng:

Điều này là ngầm khi làm một bản sao nông.
Điều này làm cho git clone --depth 1cách dễ nhất để tiết kiệm băng thông.

Và kể từ Git 1.9.0 (tháng 2 năm 2014), các bản sao nông hỗ trợ truyền dữ liệu (đẩy / kéo), do đó tùy chọn đó thậm chí còn hữu ích hơn bây giờ.
Xem thêm tại " Có phải git clone --depth 1(bản sao nông) hữu ích hơn so với thực hiện không? ".


"Hoàn tác" một bản sao nông được trình bày chi tiết tại " Chuyển đổi bản sao nông thành bản sao đầy đủ " (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

Như Chris bình luận:

dòng ma thuật để lấy các nhánh bị thiếu để đảo ngược --single-branchlà (git v2.1.4):

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

Với Git 2.26 (Q1 2020), " git clone --recurse-submodules --single-branch" hiện sử dụng tùy chọn một nhánh đơn khi nhân bản các mô hình con .

Xem cam kết 132f600 , cam kết 4731957 (21 tháng 2 năm 2020) bởi Emily Shaffer ( nasamuffin) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết b22db26 , ngày 05 tháng 3 năm 2020)

clone: vượt qua - nhánh đơn trong khi --recurse-mô đun con

Đã ký: Emily Shaffer
Acked-by: Jeff King

Trước đây, việc thực hiện " git clone --recurse-submodules --single-branch" đã dẫn đến các mô đun con nhân bản tất cả các nhánh mặc dù siêu dự án chỉ nhân bản một nhánh.

Chuyển --single-branchqua khung trợ giúp mô hình con để làm cho nó ' clone' sau này.


80
git clone <url> --branch <branch> --single-branch <folder>hoạt động như một lá bùa.
Alexander

1
Vâng, tôi nghĩ rằng đã đến lúc cập nhật câu trả lời được chấp nhận :) Điều này "hoạt động như một cơ duyên"
kumarharsh

5
Ngoài ra, điều này là ngầm khi làm một bản sao nông. Điều này làm cho clone --depth 1cách dễ nhất để tiết kiệm băng thông.
Tobu

1
@Tobu và VonC --depth 1không an toàn cho người dùng vì họ có thể thực sự muốn đẩy / kéo với bản sao mới.
nmr

2
Chỉ cần đánh vần đầy đủ sự điều chỉnh của Peter Cordes, dòng ma thuật để lấy các nhánh bị thiếu để đảo ngược --single-branchgit config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*git fetch --unshallow(git v2.1.4)
Chris

670

Một cách là thực hiện như sau.

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

Trong trường hợp branch_namelà một nhánh của sự lựa chọn của bạn và "/ thư mục / của bạn" là thư mục đích cho chi nhánh đó. Đúng là điều này sẽ mang lại cho các chi nhánh khác cho bạn cơ hội hợp nhất qua lại.

Cập nhật

Bây giờ, bắt đầu với Git 1.7.10, bây giờ bạn có thể làm điều này

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

36
Điều này hoạt động, nhưng nó lấy tất cả các chi nhánh. Xem @ frerich = câu trả lời của raabe dưới đây.
cdunn2001

3
Cảm ơn bạn. chỉ thêm "-b Branch_name" trong trường hợp của tôi. Nó giúp tôi tiết kiệm rất nhiều thời gian.
PhátHV

Vâng, nó hoạt động hoàn hảo ...! Tôi là một người TFS và cho các dự án cá nhân của tôi đã sử dụng git. Wrto git rẽ nhánh, tôi đã làm sai cách trước đó và thật tốt khi biết phương pháp dễ dàng này và nó có vẻ hoàn hảo! Cảm ơn một lần nữa! Đã + 1'd, nếu có thể tôi sẽ cho +100 :)
k25

11
Bạn cũng có thể thêm --single-branchđể chỉ tìm nạp lịch sử được liên kết với nhánh này thay vì tất cả lịch sử & thẻ mà kho lưu trữ chứa.
lỗ hổng

1
@AlexNolasco Bạn có thể vui lòng chỉnh sửa câu trả lời cho biết thư mục / some / là gì không? Cảm ơn bạn
Nabin

112

Sử dụng Git phiên bản 1.7.3.1 (trên Windows), đây là những gì tôi làm ( $BRANCHlà tên của chi nhánh tôi muốn kiểm tra và $REMOTE_REPOlà URL của kho lưu trữ từ xa mà tôi muốn sao chép):

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

Ưu điểm của phương pháp này là các cuộc gọi git pull(hoặc git fetch) tiếp theo cũng sẽ chỉ tải xuống chi nhánh được yêu cầu.


Có gì khác nhau giữa kịch bản của bạn và dòng này? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik họ giống nhau?
Ian Vaughan

12
@Ian: Một điểm khác biệt là git clone -bcung cấp cho bạn tất cả các ref từ xa (tất cả các nhánh và thẻ từ xa) như git branch -ahiển thị. Với kịch bản của tôi, bạn chỉ nhận được một ref.
Frerich Raabe

1
Khi tôi thử cách trên (nói với $ BRANCH = "nick"), tôi nhận được 'fatal: Không thể tìm thấy ref / ref / nick' từ xa. Dường như không hiệu quả với tôi ...
Nick

3
Lưu ý rằng -t $BRANCHhoạt động ngay cả khi không có -f, sẽ tìm nạp ngay lập tức. Sau đó, git fetch originsẽ tìm nạp và git checkout $BRANCHsẽ thiết lập chi nhánh địa phương và thanh toán. Điều đó hữu ích khi bạn cần định cấu hình điều khiển từ xa trước khi tìm nạp, vd git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001

1
Vì tôi đang ở trong một công ty "cũ" (1.6.0.2), tôi bị ràng buộc với giải pháp trên. Tôi gặp vấn đề tương tự như @Nick. Thực hiện git branch -acho thấy origin/$BRANCH. Làm git checkout origin/$BRANCHcố định này.
dr jerry

30

Bạn có thể thử con đường dài:

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

Điều này làm là:

  • Tạo và khởi tạo một kho Git trống.
  • Thêm kho lưu trữ ban đầu dưới dạng từ xa được gọi là nguồn gốc .
  • Chỉ tìm nạp các nhánh bạn yêu cầu từ nguồn gốc được gọi là từ xa .
  • Tạo và kiểm tra một nhánh mới được thiết lập để theo dõi nhánh nguồn mà bạn vừa nhân bản.

Hy vọng rằng đó sẽ là một cái gì đó giống như những gì bạn đang theo đuổi.


Các đối số để thêm git từ xa được hoán đổi, nhưng sau đó tôi không thể kiểm tra để làm việc. "git checkout origin / rails" đã cho tôi "lỗi: pathspec 'origin / rails' không khớp với bất kỳ tập tin nào được biết đến với git." và giải pháp thay thế đã cho tôi "fatal: git checkout: cập nhật đường dẫn không tương thích với các nhánh chuyển đổi."
Casey Rodarmor

@rodarmor: đã sửa lệnh git từ xa, cảm ơn. Bạn có thể dán đầu ra của git branch -r?
jkp

@jkp, Thật git branch -rra không có đầu ra.
Casey Rodarmor

@rodarmor: Tôi đã sửa ví dụ và điều này chắc chắn hoạt động (đã thử nghiệm). HTH (bạn có thể chấp nhận nó một khi đã thử nghiệm nó mà bạn thích;))
jkp

công tắc -b tương đối mới. Lần trước tôi đã chạy nó trên một debian bóp nó không có sẵn, IIRC
sehe

23

Bạn có thể làm điều đó bằng cách sử dụng lệnh dưới đây:

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

2
Hoạt động hoàn hảo, tôi thực sự gặp vấn đề trong Source Tree để sao chép một nhánh duy nhất, do đó đã thực hiện thủ công
azhar22k

17

Từ trang git-clone man :

--single-branchlà bạn của bạn trong quá trình sao chép, hãy nhớ sử dụng với --branch <branch name>hoặc chỉ có CHÍNH chính từ xa sẽ được nhân bản (theo mặc định)

Luôn nhớ làm Ctrl+ F5để đọc nguồn mới, không phải nguồn từ bộ đệm :-) (Tôi đã không biết về tùy chọn này trong thời gian dài.)


1
git clone <url> --branch <chi nhánh> --single-chi nhánh <thư mục>
shridutt kothari 7/07/2015

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

Chỉ cần đặt URL và tên chi nhánh.


8

Chỉ nhân bản một nhánh. Đây là cách dễ dàng nhất:

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

4

Để nhân bản một chi nhánh cụ thể, bạn có thể làm:

git clone --branch yourBranchName git@yourRepository.git


3

Để sao chép một nhánh của Git mà bạn không có khóa chung, hãy sử dụng:

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

2

Mở cmd.

cd folder_name (nhập đường dẫn để nhân bản chi nhánh)

Chỉ cần một lệnh:

git clone url_of_projecturltoclone -b branch_name

2

Hơi muộn một chút nhưng tôi muốn thêm giải pháp tôi đã sử dụng để giải quyết vấn đề này. Tôi tìm thấy giải pháp ở đây .

Dù sao, câu hỏi dường như đang hỏi 'làm thế nào để bắt đầu một dự án mới từ một chi nhánh của một repo khác?'

Về vấn đề này, giải pháp tôi đã sử dụng là trước tiên tạo một repo mới trong github hoặc bất cứ nơi nào. Điều này sẽ phục vụ như là repo cho dự án mới của bạn.

Trên máy cục bộ của bạn, điều hướng đến dự án có chi nhánh bạn muốn sử dụng làm mẫu cho dự án mới của bạn.

Chạy lệnh:

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

Điều này sẽ làm là đẩy old_branch sang new-repo và biến nó thành nhánh chính của repo mới.

Sau đó, bạn chỉ cần sao chép repo mới xuống thư mục cục bộ của dự án mới và bạn có một dự án mới bắt đầu tại chi nhánh cũ.


2

Hãy để chúng tôi lấy ví dụ về bình repo. Nó có 3 nhánh ngoài chủ. Hãy để chúng tôi kiểm tra chi nhánh từ xa 1.1.x

nhân bản repo git

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

cd vào repo.

cd flask

tìm nạp chi nhánh từ xa 1.1.x

git fetch origin 1.1.x

kiểm tra chi nhánh

git checkout 1.1.x

Bạn sẽ chuyển sang nhánh 1.1.x và nó sẽ theo dõi nhánh 1.1.x từ xa.


0

Tương tự như những gì @ nosaiba-darwish đã nói ở đây: ở đây

Đây là những gì chúng ta thường làm trong công ty của chúng tôi:

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


0

Nếu bạn muốn một bản sao nông, bạn có thể làm điều này với:

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

--depth=1ngụ ý --single-branch.


0

Có hai giải pháp chủ yếu cho việc này:

  1. Bạn cần chỉ định tên nhánh bằng chuyển đổi lệnh -b. Đây là cú pháp của lệnh để sao chép nhánh git cụ thể.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

Ví dụ: git clone -b tahir https://github.com/Rep repository / Project.git

Lệnh sau sẽ sao chép nhánh tahir từ kho git. Lệnh trên chỉ nhân bản nhánh cụ thể nhưng lấy các chi tiết của các nhánh khác. Bạn có thể xem tất cả các chi tiết chi nhánh với lệnh. git branch -a

  1. Bạn có thể sử dụng cờ '--single-Branch' để ngăn tìm nạp chi tiết của các nhánh khác như bên dưới:

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

Ví dụ: git clone -b tahir --single-nhánh https://github.com/Rep repository / Project.git

Bây giờ nếu bạn làm một git branch -a , nó sẽ chỉ hiển thị một nhánh duy nhất hiện tại của bạn mà bạn đã nhân bản và không phải tất cả các nhánh. Vì vậy, nó phụ thuộc vào bạn như thế nào bạn muốn nó.

Hy vọng nó sẽ giúp được ai đó vào một ngày nào đó !! ...


0

bạn có thể sử dụng lệnh này để git một nhánh và đổi tên thư mục nếu bạn muốn giữ nhánh độc lập

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

thí dụ

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


-1

Có thể được thực hiện trong 2 bước

  1. Nhân bản kho lưu trữ

    • git clone <http url>
  2. Kiểm tra chi nhánh bạn muốn

    • git checkout $BranchName
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.