使用 Git 下载特定标签

Posted

技术标签:

【中文标题】使用 Git 下载特定标签【英文标题】:Download a specific tag with Git 【发布时间】:2010-10-21 23:23:19 【问题描述】:

我正在尝试弄清楚如何下载 Git 存储库的特定标签 - 它是当前版本的一个版本。

我在 git 网页上看到了以前版本的标签,对象名称是长十六进制数字。

但根据网站,版本名称是“Tagged release 1.1.5”。

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

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

我确实得到了一些东西——一个目录、一堆子目录等等。

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

【问题讨论】:

我在与生产完全不同的存储库上开发,所以当我尝试使用 git checkout 时,我的生产不知道任何标签。解决方案是使用“git pull --tags”,然后使用 git checkout。 "git fetch --tags" 也有效 为了避免克隆整个存储库然后切换到标签,您可以直接执行clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc。当然,这仅在您没有同名的分支时才有效(取决于您的方法,这可能永远不会发生)。 @RedGlyph 谢谢,我会试试的。否则我们可以这样做。 git checkout -b new-branch tag-name。现在克隆你的新分支。我们可以随时删除新分支。 【参考方案1】:
$ git clone

将为您提供整个存储库。

克隆后,您可以列出带有$ git tag -l 的标签,然后签出特定标签:

$ git checkout tags/<tag_name>

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

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

【讨论】:

是的。 git 在这方面与颠覆不同。 svn 标签基本上将文件复制到新文件夹,因此您可以 svn checkout 特定的一堆文件,而 git 标签只是指向特定修订的指针。 如果你的分支和标签同名怎么办?如果您只是说“git checkout ”,它会说“警告:refname '' 不明确。切换到分支''” - 你如何告诉它切换到标签?跨度> 在结帐时,正如 Derek 提到的,回购进入“分离头”状态。相反,添加 -b 标志告诉 git 创建一个新分支并指定一个分支名称:git checkout &lt;tag_name&gt; -b &lt;branch_name&gt; @hellatan 你应该只在你真正想要创建一个分支时才这样做,但大多数时候你可能不这样做。在“分离的头”状态下运行不会伤害您,如果您只想检查一些 git 历史记录,这可能正是您想要的。 在 git 版本 1.8.3.5 和更新的版本中,--branch &lt;tag ref&gt; 应该允许您从 &lt;tag ref&gt; 开始下载存储库作为 repo HEAD;结合--depth 1 将进行浅标签结帐。见***.com/a/21699307/1695680【参考方案2】:
git clone --branch my_abc http://git.abc.net/git/abc.git

将克隆 repo 并将您留在您感兴趣的标签上。

git clone 状态的 1.8.0 文档。

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

【讨论】:

这确实(至少现在)适用于标签,尽管您最终处于分离的 HEAD 状态。 仅供参考:同时指定 --depth 1 以避免下载任何非当前提交。 这确实 not 与标签一起工作。只有树枝。编辑:看起来只有较新版本的 git 支持。 我们还可以编辑 .git/config(或以某种方式对其进行配置)以对两个或多个标签进行浅克隆,如果可能需要,将浅克隆升级为完整克隆等。 你也可以指定你想要的分支以及标签。就像git clone --branch my_abc http://git.abc.net/git/abc.git -b quality quality 是我们想要顺便说一句的分支的名称。【参考方案3】:

为了只检查给定的部署标签,我使用例如:

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

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

注意:根据the Git manual,默认情况下传递--depth 标志意味着--single-branch

--深度

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

【讨论】:

--depth n 暗示 --single-branch。你不需要两者。 @RyanNerd +1 :) 另外,对于花费最后一小时弄清楚这一点的其他人,请注意:如果在 Windows 上运行此命令,请不要引用分支/标签名称。在查找分支/标签时,它将按原样包含引号 我正在尝试将克隆作为部署脚本的一部分。有没有办法隐藏“分离头”消息?我试过了:git clone -b 'v2.0' --quiet --depth 1 https://github.com/git/git.git 不过还是不行。【参考方案4】:

我不是 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 manual)

每个 git 存储库都包含完整的修订历史记录,因此克隆存储库可以让您访问最新的提交,以及之前的所有内容,包括您正在寻找的标签。

【讨论】:

谢谢。在签出“gh-pages”分支中的版本时,我需要使用git checkout -b b1.5.0 v1.5.0 才能成功推送到 Github Pages。我写的这个 Gist 可能会对其他人有所帮助:分支/标签/子模块...gist.github.com/1064750 我认为这并不完全准确(例如粘贴到终端),因为您必须先将cd 转换为abc/,然后才能结帐分支 @StevenLu 你当然是对的。我要的是概念而不是剪切和粘贴,但它可能尽可能准确。我添加了cd【参考方案5】:

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

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

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

    列出标签:

    git tag
    
    0.0.1
    0.1.0
    

    导出标签:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    

    注意事项:

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

【讨论】:

此命令不适用于子模块,请参阅***.com/questions/1591387/… 但是 git archive 也去掉了版本控制,所以不能再做一个 git checkout 来升级到下一个标签。 是的,您失去了版本控制,但与 git clone 相比,git 存档节省的时间绝对令人难以置信! +1 这与我想要的非常接近,除了git archive 要求我输入密码,而我只想从公共存储库下载。如何让它使用 http 而不是 ssh? 这会失败并出现fatal: Operation not supported by protocol.Unexpected end of command stream 错误。或者,它也可以返回fatal: The remote end hung up unexpectedly 错误。【参考方案6】:

使用--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 将接收对象并(需要)仅解析指定分支/标签的增量 - 同时签出完全相同数量的文件!根据源存储库,这将为您节省大量磁盘空间。 (另外,它会更快。)

【讨论】:

谁对这个答案投了反对票/反对票:还请留下评论并简要说明反对票。 (只是问,因为我有点困惑。因为,afaik,这是给定问题的最佳解决方案。如果你不这么认为,我想知道为什么。) 非常感谢。 不要试图过多地理解反对票..你的回答非常好,他们的反对票可能没有根据..这就是 SOF 的生活..【参考方案7】:

首先获取该特定远程中的所有标签

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

只需输入

git fetch <remote>

然后检查可用的标签

git tag -l

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

git checkout tags/<tag_name>

希望对你有帮助!

【讨论】:

为什么使用 'git tag -l' 它应该和 'git tag' 一样? @serup; git tag 将添加一个标签,而git tag -l 列出可用标签【参考方案8】:

如果您的标签可以使用 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

(因为您要求的是第二个最近的标签)

要签出标签,首先克隆 repo,然后输入:

git checkout v1.0.4

..或者你需要的任何标签。

【讨论】:

直到你达到 v1.0.10,然后坏事发生:) 让您的标签按时间顺序排序:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags 单行自动签出最新版本,git checkout `git tag | sort -n | tail -1` 您可能想要使用sort -V 而不是sort -n。前者正确处理版本,不一定是数字,例如“1.2.3”。它还知道“0.4.10”在“0.4.1”之后而不是在“0.4.2”之后-n会给你。【参考方案9】:
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

您在哪里看到冒号,即远程名称:本地名称,这里它们是标签名称。这运行不会打乱工作树等。它似乎只是将东西从远程复制到本地机器,所以你有自己的副本。

git fetch gitserver --dry-run Fix_110:Fix_110

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

git fetch gitserver remotetag:localtag

才是真正的答案。

=

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

git rebase -i XXXXX 

需要提交,问题就出现了“您如何对包含您的第一个软件更改的更改进行rebase?”所以当我开始工作时,我会这样做

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

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

git rebase -i EMPTY 

如果我想对我所有的工作进行变基,包括第一次更改

【讨论】:

【参考方案10】:

我查看了git checkout documentation,发现了一件有趣的事情:

git checkout -b ,其中 是提交的名称 在哪里开始新的分支; 默认为 HEAD

所以我们可以提到标签名称(因为标签不过是提交的名称),比如:

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

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

【讨论】:

或者,如果您不希望进行任何更改并且只想查看代码在该标签上的样子,您可以直接签出该标签而无需创建分支。您会收到一些说明您处于“分离头”状态的文本,如果您愿意,您可以随时创建分支。【参考方案11】:

根据 Peter Johnson 的回答,我为自己创建了一个不错的小别名:

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

又名'git checkout latest tag'。

这依赖于 GNU 版本的 sort,它可以适当地处理像 lOranger 指出的情况:

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

如果您使用的是 Mac,请brew install coreutils 然后调用 gsort。

【讨论】:

【参考方案12】:

尝试:

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

【讨论】:

如果存储库有多个分支,那么将克隆哪个分支?【参考方案13】:

Checking out Tags

如果你想查看一个标签指向的文件的版本,你可以做一个 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 标记略有不同,因为它会随着您的新更改继续前进,所以要小心。

【讨论】:

【参考方案14】:

我这样做是通过 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 ; \

【讨论】:

这适用于分支和标签,但不适用于需要为其创建标签的 master 负责人。恕我直言,获得最小尺寸版本的方式非常优雅。【参考方案15】:

我做了如下

git checkout tags/20210511 -b 20210511-release

【讨论】:

【参考方案16】:

我经常用一个

git clone  --branch <tag_name> <repo_url>

【讨论】:

以上是关于使用 Git 下载特定标签的主要内容,如果未能解决你的问题,请参考以下文章

Git的使用--打tag

git使用笔记打标签

git 打标签

如何克隆特定的 Git 标签

git tag的基本用法

Jenkins Git 插件:如何构建特定标签?