Tải xuống một thẻ cụ thể với Git


1941

Tôi đang cố gắng tìm hiểu làm thế nào tôi có thể tải xuống một thẻ cụ thể của kho Git - đó là một phiên bản phía sau phiên bản hiện tại.

Tôi thấy có một thẻ cho phiên bản trước trên trang web git, với tên đối tượng của một số hex dài.

Nhưng tên phiên bản là " Tagged release 1.1.5" theo trang web.

Tôi đã thử một lệnh như thế này (với tên đã thay đổi):

git clone http://git.abc.net/git/abc.git my_abc

Và tôi đã nhận được một cái gì đó - một thư mục, một loạt các thư mục con, v.v.

Nếu đó là toàn bộ kho lưu trữ, làm thế nào để tôi có được phiên bản tôi đang tìm kiếm? Nếu không, làm cách nào để tải xuống phiên bản cụ thể đó?


11
Tôi phát triển trên một repo hoàn toàn khác sau đó là sản xuất, vì vậy sản phẩm của tôi không biết bất kỳ thẻ nào khi tôi cố gắng sử dụng thanh toán git. Giải pháp là sử dụng "git pull --tags" sau đó sử dụng git checkout.
Kiến trúc sư doanh nghiệp

11
"git fetch --tags" cũng hoạt động
John Erck

16
Để tránh nhân bản toàn bộ kho lưu trữ sau đó chuyển sang thẻ, bạn có thể trực tiếp làm một clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Điều này sẽ chỉ hoạt động nếu bạn không có một chi nhánh có cùng tên khóa học (tùy thuộc vào phương pháp của bạn, điều này có thể không bao giờ xảy ra).
RedGlyph

3
@RedGlyph Cảm ơn tôi sẽ thử nó. Khác chúng ta có thể làm như thế này. git checkout -b new-branch tag-name. Bây giờ nhân bản chi nhánh mới của bạn. Khi nào chúng ta muốn, chúng ta có thể xóa chi nhánh mới.
kalidasan

Câu trả lời:


2871
$ git clone

sẽ cung cấp cho bạn toàn bộ kho lưu trữ.

Sau khi sao chép, bạn có thể liệt kê các thẻ với $ git tag -lvà sau đó kiểm tra một thẻ cụ thể:

$ git checkout tags/<tag_name>

Thậm chí tốt hơn, hãy kiểm tra và tạo một nhánh (nếu không bạn sẽ ở trên một nhánh được đặt tên theo số sửa đổi của thẻ):

$ git checkout tags/<tag_name> -b <branch_name>

15
Vâng. git là khác nhau để lật đổ trong khía cạnh này. Về cơ bản, thẻ svn sao chép các tệp vào một thư mục mới, vì vậy bạn có thể kiểm tra svn một bó tệp cụ thể, trong khi thẻ git chỉ đơn giản là con trỏ tới các phiên bản cụ thể.
dbr

5
Điều gì nếu bạn có một chi nhánh và một thẻ có cùng tên? Nếu bạn chỉ nói "git checkout <name>" thì nó báo "cảnh báo: refname '<name>' là mơ hồ. Chuyển sang nhánh '<name>'" - làm thế nào để bạn bảo nó chuyển sang thẻ thay thế?
MatrixFrog

54
khi thực hiện kiểm tra và như Derek đã đề cập, repo rơi vào trạng thái "tách rời". thay vào đó, hãy thêm -bcờ git để tạo một nhánh mới và chỉ định tên nhánh:git checkout <tag_name> -b <branch_name>
hellatan

22
@hellatan Bạn chỉ nên làm điều đó khi bạn thực sự muốn tạo một nhánh, nhưng hầu hết thời gian bạn có thể không làm. Chạy trong trạng thái "tách rời" sẽ không làm tổn thương bạn, và có khả năng chính xác là những gì bạn muốn nếu bạn chỉ muốn kiểm tra một số lịch sử git.
máy vào

4
Trong phiên bản git 1.8.3.5và mới hơn, --branch <tag ref>nên cho phép bạn tải xuống kho lưu trữ bắt đầu với <tag ref>tư cách là repo HEAD; kết hợp với --depth 1sẽ làm một kiểm tra thẻ nông. Xem stackoverflow.com/a/21699307/1695680
ThorSummoner

409
git clone --branch my_abc http://git.abc.net/git/abc.git

Sẽ sao chép repo và để lại cho bạn thẻ mà bạn quan tâm.

Tài liệu cho 1.8.0 trạng thái nhân bản git .

--branch cũng có thể lấy các thẻ và tách ra CHÍNH tại cam kết đó trong kho lưu trữ kết quả.


7
Điều này (ít nhất là bây giờ) hoạt động cho các thẻ, mặc dù bạn kết thúc ở trạng thái CHÍNH tách rời.
mxcl

72
FYI: Cũng xác định --depth 1để tránh tải xuống bất kỳ cam kết không hiện tại.
Acumenus

4
Điều này thực sự không hoạt động với các thẻ. Chỉ có cành. Chỉnh sửa: Có vẻ như chỉ các phiên bản mới hơn của git hỗ trợ điều đó.
lzap

Chúng tôi cũng có thể chỉnh sửa .git / config (hoặc bằng cách nào đó định cấu hình nó) để tạo một bản sao nông của hai hoặc nhiều thẻ, nếu cần, hãy nâng cấp một bản sao nông thành bản sao đầy đủ, v.v.
Sam Watkins

bạn cũng có thể chỉ định nhánh bạn muốn cùng với thẻ. Giống như git clone --branch my_abc http://git.abc.net/git/abc.git -b qualitychất lượng là tên của chi nhánh chúng tôi muốn btw.
hazimdikenli

180

Để chỉ kiểm tra một thẻ nhất định để triển khai, tôi sử dụng, ví dụ:

git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git

Đây dường như là cách nhanh nhất để kiểm tra mã từ kho lưu trữ từ xa nếu người ta chỉ quan tâm đến mã gần đây nhất thay vì trong một kho lưu trữ hoàn chỉnh. Theo cách này, nó giống với lệnh 'svn co'.

Lưu ý: Theo hướng dẫn sử dụng Git , việc chuyển --depthcờ ngụ ý --single-branchtheo mặc định.

--chiều sâu

Tạo một bản sao nông với một lịch sử được cắt ngắn theo số lần xác định. Ngụ ý - nhánh đơn trừ khi --no-nhánh đơn được đưa ra để lấy lịch sử gần các mẹo của tất cả các nhánh. Nếu bạn muốn sao chép các mô đun con một cách nông cạn, cũng vượt qua - các mô hình con nông.


10
không thể tin nó phức tạp đoán không ai mong đợi mã của họ sẽ được sử dụng bởi người khác.
Ben

9
@Ben, đây thực sự là giải pháp đơn giản nhất (bắt buộc phải có một lệnh)
Eliran Malka

3
@Ben tại sao lại phức tạp thế này? Đó là một usecase đặc biệt với một vài tính năng bạn muốn làm khác với mặc định. Tất nhiên bạn cần chỉ định nó. Giải pháp bình thường sẽ là kiểm tra toàn bộ repo trong một vcs phân tán .
erikbwork

9
@Ben nói đúng. git rất phức tạp và được Linus viết vào NĂM trước và anh ấy là người duy nhất "thực sự" hiểu cách thức hoạt động của nó. xkcd.com/1597
RyanNerd

11
--depth nngụ ý --single-branch. Bạn không cần cả hai.
Niyaz

98

Tôi không phải là một chuyên gia git, nhưng tôi nghĩ rằng điều này sẽ làm việc:

git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc 

HOẶC LÀ

git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc

Biến thể thứ hai thiết lập một nhánh mới dựa trên thẻ, cho phép bạn tránh một 'ĐẦU tách rời'. (hướng dẫn kiểm tra git)

Mỗi repo git chứa toàn bộ lịch sử sửa đổi, do đó, nhân bản repo cho phép bạn truy cập vào cam kết mới nhất, cộng với mọi thứ xuất hiện trước đó, bao gồm cả thẻ bạn đang tìm kiếm.


4
Cám ơn. Tôi cần sử dụng git checkout -b b1.5.0 v1.5.0khi kiểm tra phiên bản trong nhánh 'gh-page' để đẩy thành công Trang Github. Gist này tôi đã viết có thể giúp người khác re: chi nhánh / thẻ / mô hình con ... gist.github.com/1064750
Chris Jacob

4
Tôi không nghĩ rằng điều này là hoàn toàn chính xác (ví dụ như dán vào thiết bị đầu cuối) vì bạn phải cdvào abc/trước khi bạn có thể kiểm tra một chi nhánh
Steven Lu

@StevenLu Tất nhiên bạn đúng. Tôi đã đi đến các khái niệm thay vì cắt và dán, nhưng nó cũng có thể chính xác nhất có thể. Tôi đã thêm cd.
Grossvogel

81

Bạn có thể sử dụng kho lưu trữ git để tải xuống một quả bóng tar cho một thẻ nhất định hoặc id xác nhận:

git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar

Bạn cũng có thể xuất kho lưu trữ zip của thẻ.

  1. Danh sách thẻ:

    git tag
    
    0.0.1
    0.1.0
    
  2. Xuất thẻ:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. Ghi chú:

    • Bạn không cần chỉ định định dạng. Nó sẽ được chọn theo tên tệp đầu ra.
    • Việc chỉ định tiền tố sẽ làm cho mã của bạn xuất sang một thư mục (nếu bạn bao gồm dấu gạch chéo).

3
Lệnh này không hoạt động với các mô hình con, xem stackoverflow.com/questions/1591387/
Khăn

3
Nhưng kho lưu trữ git cũng loại bỏ kiểm soát phiên bản, vì vậy bạn không thể thực hiện một kiểm tra git khác để nâng cấp lên thẻ tiếp theo.
idbrii

9
Có bạn mất kiểm soát phiên bản nhưng lưu trữ git thời gian tiết kiệm so với git clone là TUYỆT ĐỐI KHÔNG THỂ! +1
MarcH

Đây là ĐÓNG với những gì tôi muốn, ngoại trừ việc git archiveyêu cầu tôi nhập mật khẩu khi tất cả những gì tôi muốn làm là tải xuống từ một repo công khai. Làm thế nào tôi có thể làm cho nó sử dụng http thay vì ssh?
robru

1
Điều này không thành công với fatal: Operation not supported by protocol.Unexpected end of command streamlỗi. Ngoài ra, nó cũng có thể trả lại fatal: The remote end hung up unexpectedlylỗi.
Acumenus

52

Sử dụng công --single-branchtắc (có sẵn kể từ Git 1.7.10) . Cú pháp là:

git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>] 

Ví dụ:

git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5

Lợi ích: Git sẽ nhận các đối tượng và (cần) giải quyết deltas chỉ cho nhánh / thẻ được chỉ định - trong khi kiểm tra chính xác cùng số lượng tệp! Tùy thuộc vào kho lưu trữ nguồn, điều này sẽ giúp bạn tiết kiệm rất nhiều dung lượng đĩa. (Thêm vào đó, nó sẽ nhanh hơn nhiều.)


3
Bất cứ ai downvote / downvote câu trả lời này: Xin vui lòng để lại một bình luận với một lời giải thích ngắn gọn cho downvote. (Chỉ hỏi, vì tôi hơi bối rối. Bởi vì, afaik, đây là giải pháp tốt nhất cho vấn đề đã cho. Và nếu bạn không nghĩ vậy, tôi muốn biết tại sao.) Rất cám ơn.
EyecatchUp

5
Đừng cố gắng hiểu quá nhiều về các downvote .. câu trả lời của bạn rất hay, các downvote của họ có khả năng không có căn cứ .. đó là cuộc sống trên SOF ..
javadba

không hoạt động trên phiên bản git 2.22.0.windows.1
Mahesh

29

đầu tiên tìm nạp tất cả các thẻ trong điều khiển từ xa cụ thể đó

git fetch <remote> 'refs/tags/*:refs/tags/*'

hoặc chỉ đơn giản là gõ

git fetch <remote>

Sau đó kiểm tra các thẻ có sẵn

git tag -l

sau đó chuyển sang thẻ cụ thể bằng lệnh bên dưới

git checkout tags/<tag_name>

Hy vọng điều này sẽ giúp bạn!


tại sao lại sử dụng thẻ ´git -l, nó phải giống với thẻ ´git?
serup

1
@serup; git tagsẽ thêm một thẻ trong khi git tag -lliệt kê các thẻ có sẵn
Joost Döbken

18

Nếu các thẻ của bạn có thể sắp xếp bằng sortlệnh linux , hãy sử dụng:

git tag | sort -n | tail -1

ví dụ. nếu git tagtrả về:

v1.0.1
v1.0.2
v1.0.5
v1.0.4

git tag | sort -n | tail -1 sẽ xuất ra:

v1.0.5

git tag | sort -n | tail -2 | head -1 sẽ xuất ra:

v1.0.4

(vì bạn đã yêu cầu thẻ gần đây thứ hai)

để kiểm tra thẻ, trước tiên hãy sao chép repo, sau đó gõ:

git checkout v1.0.4

.. hoặc bất cứ thẻ nào bạn cần.


25
Cho đến khi bạn đạt được v1.0.10, và sau đó những điều tồi tệ sẽ xảy ra :)
Laurent Grégoire

10
Để các thẻ của bạn được sắp xếp theo thứ tự thời gian:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G

Một lớp lót để tự động kiểm tra phiên bản mới nhất,git checkout `git tag | sort -n | tail -1`
weiji14

Bạn có thể muốn sử dụng sort -Vthay vì sort -n. Phiên bản trước xử lý chính xác các phiên bản không nhất thiết phải là số, ví dụ: "1.2.3". Nó cũng hiểu rằng "0.4.10" đi sau "0.4.1" chứ không phải sau "0.4.2" -nsẽ cung cấp cho bạn.
Mateusz Misiorny

16

Tôi đã kiểm tra tài liệu kiểm tra git , nó tiết lộ một điều thú vị:

git checkout -b <new_branch_name> <start_point>, trong đó <start_point> là tên của một cam kết để bắt đầu chi nhánh mới; Mặc định cho CHÍNH

Vì vậy, chúng ta có thể đề cập đến tên thẻ (vì thẻ không là gì ngoài tên của một cam kết) như, nói:

>> kiểm tra git -b 1.0.2_branch 1.0.2
sau, sửa đổi một số tệp
>> git đẩy --tags

PS: Trong Git, bạn không thể cập nhật thẻ trực tiếp (vì thẻ chỉ là nhãn thành cam kết), bạn cần kiểm tra thẻ giống như một nhánh và sau đó cam kết với thẻ đó rồi tạo thẻ riêng.


1
Hoặc nếu bạn không muốn thực hiện bất kỳ thay đổi nào và bạn chỉ muốn xem mã trông như thế nào trong thẻ đó, bạn chỉ có thể kiểm tra thẻ mà không cần tạo chi nhánh. Bạn sẽ nhận được một số văn bản giải thích rằng bạn đang ở trạng thái "tách rời" và bạn luôn có thể tạo chi nhánh sau nếu muốn.
MatrixFrog

16
git fetch <gitserver> <remotetag>:<localtag>

===================================

Tôi chỉ làm điều này. Đầu tiên tôi chắc chắn rằng tôi biết chính tả tên thẻ.

git ls-remote --tags gitserver; : or origin, whatever your remote is called

Điều này đã cho tôi một danh sách các thẻ trên máy chủ git của tôi để lựa chọn. Người đăng ban đầu đã biết tên thẻ của anh ấy nên bước này không cần thiết cho mọi người. Đầu ra trông như thế này, mặc dù danh sách thực sự dài hơn.

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3    refs/tags/Fix_110

Tôi đã chọn thẻ tôi muốn và lấy nó và không có gì hơn như sau.

git fetch gitserver Fix_110

Sau đó tôi đã gắn thẻ này trên máy cục bộ của mình, đặt tên của tôi cùng tên.

git tag Fix_110 FETCH_HEAD

Tôi không muốn sao chép kho lưu trữ từ xa như những người khác đã đề xuất, vì dự án tôi đang thực hiện rất lớn và tôi muốn phát triển trong một môi trường sạch đẹp. Tôi cảm thấy điều này gần với các câu hỏi ban đầu "Tôi đang cố gắng tìm ra cách tải xuống TAG THAM GIA" so với giải pháp gợi ý nhân bản toàn bộ kho lưu trữ. Tôi không thấy lý do tại sao mọi người phải có một bản sao mã nguồn Windows NT và Windows 8.1 nếu họ muốn xem mã nguồn DOS 0.1 (ví dụ).

Tôi cũng không muốn sử dụng KIỂM TRA như những người khác đã đề xuất. Tôi đã có một chi nhánh kiểm tra và không muốn ảnh hưởng đến điều đó. Ý định của tôi là tìm nạp phần mềm tôi muốn để tôi có thể chọn thứ gì đó và thêm nó vào sự phát triển của mình.

Có lẽ có một cách để tự tìm nạp thẻ chứ không chỉ là một bản sao của cam kết đã được gắn thẻ. Tôi đã phải gắn thẻ cam kết tìm nạp chính mình. EDIT: Ah vâng, tôi đã tìm thấy nó bây giờ.

git fetch gitserver Fix_110:Fix_110

Nơi bạn nhìn thấy dấu hai chấm, đó là tên từ xa: tên cục bộ và ở đây chúng là tên thẻ. Điều này chạy mà không làm đảo lộn cây làm việc, vv Nó dường như chỉ sao chép nội dung từ xa vào máy cục bộ để bạn có bản sao của riêng mình.

git fetch gitserver --dry-run Fix_110:Fix_110

với tùy chọn --dry-run được thêm vào sẽ cho phép bạn xem lệnh sẽ làm gì, nếu bạn muốn xác minh những gì bạn muốn. Vì vậy, tôi đoán một đơn giản

git fetch gitserver remotetag:localtag

là câu trả lời thực sự.

= =

Một lưu ý riêng về thẻ ... Khi tôi bắt đầu một cái gì đó mới, tôi thường gắn thẻ kho lưu trữ trống sau git init, kể từ khi

git rebase -i XXXXX 

yêu cầu một cam kết và câu hỏi đặt ra "làm thế nào để bạn thực hiện các thay đổi bao gồm thay đổi phần mềm đầu tiên của bạn?" Vì vậy, khi tôi bắt đầu làm việc tôi làm

git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY

tức là tạo một cam kết trước khi thay đổi thực sự đầu tiên của tôi và sau đó sử dụng

git rebase -i EMPTY 

nếu tôi muốn từ chối tất cả công việc của mình, kể cả thay đổi đầu tiên .


8

Từ bỏ câu trả lời của Peter Johnson, tôi đã tạo ra một bí danh nhỏ cho riêng mình:

alias gcolt="git checkout $(git tag | sort -V | tail -1)"

còn gọi là 'git checkout tag mới nhất'.

Điều này phụ thuộc vào phiên bản sắp xếp GNU, xử lý một cách thích hợp các tình huống như lOranger đã chỉ ra:

v1.0.1
...
v1.0.9
v1.0.10

Nếu bạn đang dùng mac, brew install coreutilssau đó gọi gsort.


6

thử:

git clone -b <name_of_the_tag> <repository_url> <destination>

Nếu có nhiều nhánh cho kho lưu trữ thì nhánh nào sẽ được nhân bản?
tauseef_CquilGuy

5

Kiểm tra thẻ

Nếu bạn muốn xem các phiên bản của tệp mà thẻ đang trỏ tới, bạn có thể thực hiện kiểm tra git, mặc dù điều này đặt kho lưu trữ của bạn ở trạng thái ĐẦU tách rời, có một số tác dụng phụ xấu:

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

Trong trạng thái ĐẦU TIÊN tách rời, nếu bạn thực hiện thay đổi và sau đó tạo một cam kết, thẻ sẽ giữ nguyên, nhưng cam kết mới của bạn sẽ không thuộc về bất kỳ chi nhánh nào và sẽ không thể truy cập được, ngoại trừ bởi hàm băm cam kết chính xác. Do đó, nếu bạn cần thực hiện các thay đổi, hãy nói rằng bạn đang sửa một lỗi trên phiên bản cũ hơn, ví dụ, bạn thường muốn tạo một nhánh:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

Nếu bạn làm điều này và thực hiện một cam kết, nhánh phiên bản 2 của bạn sẽ hơi khác so với thẻ v2.0.0 vì nó sẽ tiến lên phía trước với những thay đổi mới của bạn, vì vậy hãy cẩn thận.


4

Tôi làm điều này là thông qua API github:

curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \

1
Cái này hoạt động cho các nhánh và thẻ, nhưng không phải là master of master cần một thẻ được tạo chống lại nó. Imho cách khá thanh lịch để có được phiên bản kích thước tối thiểu.
J0hnG4lt
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.