Câu hỏi Tải xuống một thẻ cụ thể với Git


Tôi đang cố gắng tìm ra cách tôi có thể tải xuống một thẻ cụ thể của kho lưu trữ Git - đó là một phiên bản đằng 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ố thứ 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 đã làm được điều 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 mà 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ể đó?


1661
2018-04-27 01:15


gốc


Tôi phát triển trên một repo hoàn toàn khác nhau sau đó sản xuất, vì vậy sản xuất của tôi không biết bất kỳ thẻ nào khi tôi cố gắng sử dụng git checkout. Giải pháp là sử dụng "git pull --tags", sau đó sử dụng git checkout. - Enterprise Architect
"git fetch --tags" cũng hoạt động - John Erck
Để 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 thực hiện 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
@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 nhánh mới của bạn. Khi chúng ta muốn chúng ta có thể xóa nhánh mới. - kalidasan


Các câu trả lời:


$ git clone

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

Sau bản sao, bạn có thể liệt kê các thẻ bằng $ git tag -l và sau đó kiểm tra một thẻ cụ thể:

$ git checkout tags/<tag_name>

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

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

2559
2018-04-27 01:53



Vâng. git khác với subversion trong khía cạnh này. Một thẻ svn về cơ bản sao chép các tập tin vào một thư mục mới, vì vậy bạn có thể svn checkout một bó cụ thể của các tập tin, trong khi thẻ git chỉ đơn giản là con trỏ đến các phiên bản cụ thể. - dbr
Điều gì sẽ xảy ra 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>" nó nói "warning: refname '<name>' là mơ hồ. Chuyển sang nhánh '<name>'" - làm thế nào để bạn nói nó chuyển sang thẻ thay thế? - MatrixFrog
MatrixFrog, để tránh sự mơ hồ, chạy git checkout tags/<name>. Nếu không, Git giả định rằng bạn muốn lấy nhánh <name>. - Derek Mahar
khi thực hiện thanh toán và như Derek đã đề cập, repo đi vào trạng thái "tách rời". thay vào đó, hãy thêm -b đánh dấu git để tạo một nhánh mới và chỉ định tên chi nhánh: git checkout <tag_name> -b <branch_name> - hellatan
@hellatan Bạn chỉ nên làm điều đó khi bạn thực sự muốn tạo một chi 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 đầu" sẽ không làm bạn tổn thương, và có thể 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. - machineghost


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

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

Tài liệu cho 1.8.0 của git clone tiểu bang.

--branch cũng có thể lấy các thẻ và gỡ bỏ HEAD tại cam kết đó trong kho lưu trữ kết quả.


269
2018-06-14 09:33



Điều này làm (ít nhất là bây giờ) làm việc cho các thẻ, mặc dù bạn kết thúc ở một trạng thái HEAD tách rời. - mxcl
FYI: Cũng chỉ định --depth 1 để tránh tải xuống bất kỳ cam kết nào hiện tại. - A-B-B
Điều này thực sự không không phải làm việc với các thẻ. Chỉ các nhánh. Chỉnh sửa: Có vẻ như chỉ các phiên bản git mới hỗ trợ điều đó. - lzap
Chúng ta cũng có thể chỉnh sửa .git / config (hoặc bằng cách nào đó cấu hình nó) để làm một bản sao nông của hai hoặc nhiều thẻ, nếu điều đó có thể cần thiết, nâng cấp một bản sao nông để sao chép đầy đủ, vv - Sam Watkins
đây phải là câu trả lời được chấp nhận, IMHO. - Sumi Straessle


Tôi không phải là chuyên gia về git, nhưng tôi nghĩ điều này sẽ hoạt động:

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 'HEAD tách rời'. (sổ tay git-checkout)

Mỗi repo git chứa toàn bộ lịch sử sửa đổi, vì vậy 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 tất cả mọi thứ đến trước, bao gồm cả thẻ bạn đang tìm kiếm.


94
2018-04-27 01:54



Cám ơn. Tôi cần sử dụng git checkout -b b1.5.0 v1.5.0 khi kiểm tra phiên bản trong nhánh 'gh-pages' để đẩy thành công vào Github Pages. Gist này tôi đã viết có thể giúp người khác lại: chi nhánh / thẻ / submodules ... gist.github.com/1064750 - Chris Jacob
Tôi không nghĩ rằng điều này là hoàn toàn chính xác (ví dụ: dán vào thiết bị đầu cuối) vì bạn phải cd vào abc/ trước khi bạn có thể thanh toán chi nhánh - Steven Lu
@StevenLu Bạn là đúng của khóa học. Tôi đã đi cho các khái niệm hơn là cắt và dán, nhưng nó cũng có thể là chính xác nhất có thể. Tôi đã thêm cd. - grossvogel


Để chỉ xem một thẻ đã cho để 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 có vẻ là cách nhanh nhất để kiểm tra mã từ một kho lưu trữ từ xa nếu một người chỉ quan tâm đến mã gần đây nhất thay vì trong một kho lưu trữ đầy đủ. Theo cách này, nó giống với lệnh 'svn co'.


85
2017-07-28 02:35



không thể tin rằng điều này phức tạp. đoán không ai hy vọng mã của họ sẽ được người khác sử dụng. - Ben
@Ben, đây thực sự là giải pháp đơn giản nhất (một lệnh duy nhất là bắt buộc) - Eliran Malka
@ Tại sao điều này phức tạp? Đó là một phiên bản đặc biệt với một vài tính năng bạn muốn làm khác với các tính năng mặc định. Tất nhiên bạn cần phải xác định nó. Các giải pháp bình thường sẽ là để kiểm tra toàn bộ repo trong một phân phối vcs. - erikbwork
@Ben là đúng. git là phức tạp af và được viết cách đây vài năm bởi Linus và anh ấy là người duy nhất "thực sự" hiểu cách hoạt động của nó. xkcd.com/1597 - RyanNerd


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

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

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

  1. Thẻ danh sách:

    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 phải xác định định dạng. Nó sẽ được chọn bởi tên tập tin đầu ra.
    • 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).

71
2017-12-09 21:46



Lệnh này không hoạt động với submodules, xem stackoverflow.com/questions/1591387/… - Zitrax
Nhưng lưu trữ git cũng loại bỏ điều khiển phiên bản, vì vậy bạn không thể chỉ thực hiện một thanh toán git khác để nâng cấp lên thẻ tiếp theo. - idbrii
Có, bạn mất kiểm soát phiên bản nhưng thời gian lưu trữ git tiết kiệm so với git clone là TUYỆT ĐỐI KHÔNG THỂ BAO GIỜ! +1 - MarcH
Đây là SO ĐÓNG với những gì tôi muốn, ngoại trừ git archive đang yê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ừ 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
Điều này không thành công với fatal: Operation not supported by protocol. và Unexpected end of command stream lỗi. Ngoài ra, nó cũng có thể trả lại fatal: The remote end hung up unexpectedly lỗi. - A-B-B


Sử dụng --single-branch công tắc điện  (có sẵn như của 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 các vùng đồng bằng cho chi nhánh / thẻ được chỉ định - trong khi kiểm tra cùng một lượng tệp chính xác! 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 không gian đĩa. (Plus, nó sẽ nhanh hơn nhiều.)


40
2018-06-25 06:28



Ai downvoted / downvotes câu trả lời này: Xin vui lòng cũ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ỉ cần hỏi, bở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 đề nhất định. Và nếu bạn không nghĩ vậy, tôi muốn biết tại sao.) Cảm ơn nhiều. - eyecatchUp
Đừng cố gắng tạo ra quá nhiều ý nghĩa của các downvotes .. câu trả lời của bạn là rất tốt, downvotes của họ có khả năng unsubstantiated .. đó là cuộc sống trên SOF .. - javadba


đầ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 là 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 cách sử dụng lệnh dưới đây

git checkout tags/<tag_name>

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


21
2017-09-10 18:57





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 nhánh mới;   Mặc định là HEAD

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

>> git checkout -b 1.0.2_branch 1.0.2
sau đó, sửa đổi một số tệp 
  >> git push --tags

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


14
2018-04-26 14:39



Hoặc nếu bạn không mong đợi 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 ở thẻ đó, bạn có thể chỉ cần 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ày nếu bạn muốn. - MatrixFrog


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

git tag | sort -n | tail -1

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

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

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

v1.0.5

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

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 đó nhập:

git checkout v1.0.4

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


14
2018-05-12 12:23



Cho đến khi bạn đạt v1.0.10, và sau đó những điều xấu xảy ra :) - Laurent Grégoire
Để 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 -V thay vì sort -n. Các phiên bản xử lý chính xác trước đây, 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" theo sau "0.4.1" và không phải sau "0.4.2" -n sẽ cho bạn. - Mateusz Misiorny


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

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

Tôi đã làm điều này. Trước 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. Các poster ban đầu đã biết tên thẻ của mình vì vậy bước này là không cần thiết cho tất cả 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ẻ thẻ này trên máy cục bộ của mình, cho thẻ 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 làm, như dự án tôi đang làm việc trên là 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 hơ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 MỘT THẺ 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 bất cứ ai cần phải có một bản sao của Windows NT và Windows 8.1 mã nguồn 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 CHECKOUT 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à lấy phần mềm mà tôi muốn để tôi có thể chọn một thứ gì đó và thêm nó vào sự phát triển của tôi.

Có lẽ có một cách để tự tìm nạp thẻ thay vì chỉ là bản sao của cam kết đã được gắn thẻ. Tôi đã phải tự gắn thẻ cho bản thân mình. EDIT: Ah có, tôi đã tìm thấy nó ngay 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 địa phương và ở đây chúng là các tên thẻ. Điều này chạy mà không làm xáo trộn cây làm việc vv Nó chỉ có vẻ để sao chép các công cụ từ xa đến máy địa phương để bạn có bản sao của riêng bạn.

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 xét 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 cách đơn giản

git fetch gitserver remotetag:localtag

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

=

Một lưu ý riêng biệt về các 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, vì

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 rebase 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 rebase tất cả công việc của tôi, bao gồm cả thay đổi đầu tiên.


13
2017-12-11 17:28