使用Git下载特定标签


1941

我试图弄清楚如何下载Git存储库的特定标签-这是当前版本之后的一个版本。

我看到git网页上有一个用于先前版本的标签,其对象名称的长度为十六进制数。

但版本名称为“ Tagged release 1.1.5”。

我尝试了这样的命令(更改了名称):

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

我确实得到了一些东西-目录,一堆子目录等。

如果是整个存储库,我如何获得要查找的版本?如果没有,如何下载该特定版本?


11
我在与产品完全不同的仓库上进行开发,因此当我尝试使用git checkout时,我的产品不知道任何标签。解决方案是使用“ git pull --tags”,然后使用git checkout。
Enterprise Architect

11
“ git fetch --tags”也可以使用
约翰·埃克

16
为了避免克隆整个存储库然后切换到标签,您可以直接执行clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc。仅当您没有相同名称的分支时,这才起作用(根据您的方法,这可能永远不会发生)。
RedGlyph 2013年

3
@RedGlyph谢谢,我会尝试的。否则我们可以这样做。git checkout -b new-branch tag-name。现在克隆您的新分支。只要有需要,我们都可以删除新分支。
卡利达桑(Kalidasan),2013年

Answers:


2871
$ git clone

将为您提供整个存储库。

克隆之后,您可以使用列出标签,$ git tag -l然后签出特定标签:

$ git checkout tags/<tag_name>

更好的是,签出并创建一个分支(否则,您将位于以标记的修订号命名的分支上):

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

15
是的 git在这方面与subversion不同。svn标记基本上会将文件复制到新文件夹,因此您可以svn检出特定的文件,而git标记只是指向特定修订版的指针。
dbr

5
如果您的分支和标签具有相同的名称怎么办?如果您只说“ git checkout <名称>”,则说“警告:refname'<name>'是不明确的。切换到分支'<name>'””-您如何告诉它切换到标签?
MatrixFrog 2010年

54
如Derek所述,在进行结帐时,回购将进入“分离头”状态。而是添加-b告诉git创建新分支的标志并指定分支名称:git checkout <tag_name> -b <branch_name>
hellatan 2012年

22
@hellatan仅在您真正想要创建分支时才应该这样做,但是大多数时候您可能不需要。在“头顶分离”状态下运行不会伤害您,如果您只想查看一些git历史记录,那么可能正是您想要的。
machineghost

4
在git版本1.8.3.5及更高版本中,--branch <tag ref>应当允许您以<tag ref>repo HEAD的形式下载存储库;结合--depth 1将进行浅标签签出。参见stackoverflow.com/a/21699307/1695680
ThorSummoner 2014年

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

将克隆存储库并使您留在您感兴趣的标签上。

有关git clone状态1.8.0的文档。

--branch还可以获取标签,并在结果存储库中的提交时分离HEAD。


7
尽管您最终处于分离的HEAD状态,但这确实(至少现在)适用于标签。
mxcl 2013年

72
仅供参考:还请指定--depth 1避免下载任何非当前提交。
Acumenus 2014年

4
这确实没有带标签的工作。仅分支机构。编辑:看起来只有较新版本的git支持该功能。
lzap 2014年

我们也可以编辑的.git / config中(或以某种方式进行配置)做两个或多个标签的浅克隆,如果可能需要升级浅克隆完整克隆,等等
萨姆·沃特金斯

您还可以指定所需分支以及标记。像git clone --branch my_abc http://git.abc.net/git/abc.git -b quality质量是我们的BTW想要的分支的名称。
hazimdikenli

180

为了仅签出给定的部署标签,我使用例如:

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

如果人们只对最新代码感兴趣,而不对完整的存储库感兴趣,这似乎是从远程存储库中检出代码的最快方法。这样,它类似于“ svn co”命令。

注意:根据Git手册,默认情况下传递--depth标志意味着隐含--single-branch

- 深度

创建一个浅表克隆,其历史记录被截断为指定的提交数。表示--single-branch,除非给出--no-single-branch来获取所有分支的尖端附近的历史记录。如果要浅层克隆子模块,则还要传递--shallow-submodules。


10
不敢相信它如此复杂。猜猜没有人期望别人使用他们的代码。

9
@Ben,这实际上是最简单的解决方案(只需一个命令)
Eliran Malka

3
@Ben为什么这么复杂?这是一个特殊的用例,具有一些您希望与默认功能有所不同的功能。当然,您需要指定它。正常的解决方案是在分布式 vcs中签出整个仓库。
erikbwork

9
@本是对的。git是复杂的文件,是几年前由Linus编写的,他是唯一“真正”了解其工作原理的人。xkcd.com/1597
RyanNerd '18年

11
--depth n暗示--single-branch。您不需要两者。
Niyaz

98

我不是git专家,但是我认为这应该有效:

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

要么

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

第二个变种基于标签建立一个新的分支,这使您可以避免“分离的HEAD”。(git-checkout手册)

每个git仓库都包含整个修订历史记录,因此克隆仓库就可以访问最新的提交,以及之前的所有内容,包括您要查找的标签。


4
谢谢。git checkout -b b1.5.0 v1.5.0在检出“ gh-pages”分支中的版本时,需要使用它才能成功推送到Github Pages。我写的这个要点可能会帮助其他人:分支/标签/子模块... gist.github.com/1064750
克里斯·雅各布

4
我不认为这是完全准确的(例如,粘贴到终端中),因为在您可以结帐之前,您必须先cd进入abc/
Steven Lu

@StevenLu你当然是正确的。我打算使用概念而不是剪切粘贴,但它可能尽可能准确。我已添加cd
grossvogel 2014年

81

您可以使用git archive下载给定标签或提交ID的tar球:

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

您还可以导出标签的zip存档。

  1. 清单标签:

    git tag
    
    0.0.1
    0.1.0
    
  2. 导出标签:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. 笔记:

    • 您不需要指定格式。它会被输出文件名拾取。
    • 指定前缀将使您的代码导出到目录(如果包含尾部斜杠)。

3
该命令不工作,子模块,见stackoverflow.com/questions/1591387/...
Zitrax

3
但是git archive也删除了版本控制,因此您不能只执行另一个git checkout升级到下一个标签。
idbrii 2011年

9
是的,您失去了版本控制权,但是与git clone相比,git存档节省的时间是绝对难以置信的!+1
MarcH 2013年

这与我想要的非常接近,只是git archive当我要做的就是从公共存储库下载密码时,要求我输入密码。如何使用http而不是ssh?
robru 2014年

1
失败,显示fatal: Operation not supported by protocol.Unexpected end of command stream错误。或者,它也可以返回fatal: The remote end hung up unexpectedly错误。
Acumenus 2014年

52

使用--single-branch开关 (自Git 1.7.10起可用)。语法为:

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

例如:

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

好处:Git仅接收指定的分支/标签的对象,并且(需要)解析增量-同时签出完全相同数量的文件!根据源存储库,这将节省大量磁盘空间。(此外,它会更快。)


3
谁投票否定了这个答案:请还留下评论并简要说明一下投票否定。(只是问一下,因为我有点困惑。因为afaik,这是解决给定问题的最佳解决方案。如果您不这样认为,我想知道为什么。)非常感谢。
eyecatchUp

5
不要试图对
下降投票

不适用于git版本2.22.0.windows.1
Mahesh,

29

首先获取该特定遥控器中的所有标签

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

只是简单地输入

git fetch <remote>

然后检查可用标签

git tag -l

然后使用以下命令切换到该特定标签

git checkout tags/<tag_name>

希望这对您有帮助!


为什么使用“ git tag -l”应该与“ git tag”相同?
serup

1
@serup; git tag将同时添加一个标签git tag -l列出了可用的标签
Joost的Döbken

18

如果您的标签可以使用linux sort命令排序,请使用以下命令:

git tag | sort -n | tail -1

例如。如果git tag返回:

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

git tag | sort -n | tail -1 将输出:

v1.0.5

git tag | sort -n | tail -2 | head -1 将输出:

v1.0.4

(因为您要求输入最近的标签)

要检出标签,首先克隆存储库,然后键入:

git checkout v1.0.4

..或您需要的任何标签。


25
直到你到达v1.0.10,然后不好的事情发生:)
洛朗格雷瓜尔

10
要按时间顺序对标签进行排序:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G

一线自动签出最新版本,git checkout `git tag | sort -n | tail -1`
weiji14

您可能要使用sort -V而不是sort -n。前者可以正确处理版本,而不一定是数字版本,例如“ 1.2.3”。还可以理解,“ 0.4.10”在“ 0.4.1”之后,而不在“ 0.4.2”之后,这-n会给您带来帮助。
Mateusz Misiorny

16

我检查了git checkout文档,发现了一件有趣的事情:

git checkout -b <new_branch_name> <start_point>,其中<start_point>是开始新分支的提交的名称;默认为HEAD

因此,我们可以将标签名称(因为标签不过是提交的名称)提及为:

>> git checkout -b 1.0.2_branch 1.0.2
之后,修改一些文件
>> git push --tags

PS:在Git中,您不能直接更新标签(因为标签只是提交的标签),您需要签出与分支相同的标签,然后提交给它,然后创建一个单独的标签。


1
或者,如果您不希望进行任何更改,而只想查看该标签的代码,则可以签出该标签而无需创建分支。您将获得一些文本来说明您处于“分离头”状态,并且如果需要,可以随时创建分支。
MatrixFrog 2010年

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

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

我就是这么做的 首先,我确保知道标签名称的拼写。

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

这给了我git服务器上可供选择的标签列表。原始海报已经知道他标签的名称,因此并非所有人都需要执行此步骤。输出看起来像这样,尽管实际列表更长。

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

我选择了想要的标签,然后将其获取,仅此而已。

git fetch gitserver Fix_110

然后,我在本地计算机上对此标签进行了标记,并赋予了标签相同的名称。

git tag Fix_110 FETCH_HEAD

我不想像其他人建议的那样克隆远程存储库,因为我正在处理的项目很大,我想在一个干净的环境中进行开发。我认为,这比建议克隆整个存储库的解决方案更接近最初的问题“我正试图找出如何下载特定标签”。我不明白为什么任何人如果要查看DOS 0.1源代码(例如),都必须拥有Windows NT和Windows 8.1源代码的副本。

我也不想像其他人建议的那样使用CHECKOUT。我有一个签出的分支,不想影响这一点。我的目的是获取所需的软件,以便可以挑选一些东西并将其添加到我的开发中。

可能有一种方法来获取标记本身,而不仅仅是获取标记的提交的副本。我必须自己标记提取的提交。编辑:是的,我现在找到了。

git fetch gitserver Fix_110:Fix_110

您在哪里看到冒号,即remote-name:local-name,此处为标记名。这将在不影响工作树等的情况下运行。它似乎只是将内容从远程复制到本地计算机,因此您拥有自己的副本。

git fetch gitserver --dry-run Fix_110:Fix_110

添加了--dry-run选项后,您可以查看该命令的功能(如果要验证其功能)。所以我想一个简单的

git fetch gitserver remotetag:localtag

才是真正的答案。

=

关于标记的单独说明...当我开始新的东西时,通常在git init之后标记空的存储库,因为

git rebase -i XXXXX 

需要提交,然后出现一个问题:“如何为包括第一次软件更改的更改重新设定基础?” 所以当我开始工作时

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

即在我第一次真正的更改之前创建一个提交,然后再使用

git rebase -i EMPTY 

如果我想重新整理我的所有工作,包括第一次更改


8

根据彼得·约翰逊的答案,我为自己创建了一个很好的别名:

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

亦称“ git checkout最新标签”。

这依赖于sort的GNU版本,该版本可以正确处理lOranger指出的情况:

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

如果您使用的是Mac,brew install coreutils请致电gsort。



5

签出标签

如果要查看标签指向的文件的版本,可以执行git checkout,尽管这会使存储库处于“分离的HEAD”状态,这会带来一些不良影响:

$ 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

在“分离式HEAD”状态下,如果您进行更改然后创建提交,则标记将保持不变,但是您的新提交将不属于任何分支,并且将无法访问,除了确切的提交哈希。因此,如果您需要进行更改(例如,例如,您要修复旧版本的错误),则通常需要创建一个分支:

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

如果执行此操作并进行提交,则您的version2分支将与v2.0.0标记稍有不同,因为它会随着新的更改而向前移动,因此请务必小心。


4

我是通过github API执行此操作的:

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
这适用于分支和标签,但不适用于需要针对其创建标签的母版主。恕我直言,获得最小尺寸版本的方式非常优雅。
J0hnG4lt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.