题 使用Git下载特定标签


我试图找出如何下载Git存储库的特定标记 - 它是当前版本背后的一个版本。

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

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

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

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

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

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


1661
2018-04-27 01:15


起源


我开发的是一个完全不同的repo然后是制作,所以当我尝试使用git checkout时,我的制作人员不知道任何标签。解决方案是使用“git pull --tags”然后使用git checkout。 - Enterprise Architect
“git fetch --tags”也有效 - John Erck
为了避免克隆整个存储库然后切换到标记,您可以直接执行 clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc。这只有在您没有具有相同名称的分支时才会起作用(取决于您的方法,这可能永远不会发生)。 - RedGlyph
@RedGlyph谢谢我会试一试。我们可以这样做。 git checkout -b new-branch tag-name。现在克隆你的新分支。我们什么时候想要删除新分支。 - kalidasan


答案:


$ git clone

将为您提供整个存储库。

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

$ git checkout tags/<tag_name>

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

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

2559
2018-04-27 01:53



是的。在这方面,git与颠覆不同。 svn标签基本上将文件复制到新文件夹,因此您可以svn签出特定的一堆文件,而git标签只是指向特定修订的指针。 - dbr
如果您有一个具有相同名称的分支和标记怎么办?如果您只是说“git checkout <name>”,它会说“警告:refname'<name>'是不明确的。切换到分支'<name>'” - 您如何告诉它切换到标签? - MatrixFrog
MatrixFrog,为了避免歧义,运行 git checkout tags/<name>。否则,Git假定你想要检索分支 <name>。 - Derek Mahar
在进行结账时,正如Derek所说,回购进入“独立头”状态。相反,添加 -b flag告诉git创建一个新分支并指定一个分支名称: git checkout <tag_name> -b <branch_name> - hellatan
@hellatan你应该只在你真正想要创建一个分支时这样做,但大多数时候你可能不这样做。以“独立头”状态运行不会伤害你,如果你只是想查看一些git历史记录,可能正是你想要的。 - machineghost


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

将克隆回购并留下您感兴趣的标签。

1.8.0的文档 git clone 状态。

--branch还可以在生成的存储库中的标记处获取标记并分离HEAD。


269
2018-06-14 09:33



这样做(至少现在)适用于标签,但最终处于分离的HEAD状态。 - mxcl
仅供参考:另请注明 --depth 1 避免下载任何非当前提交。 - A-B-B
确实如此 不 使用标签。只有分支。编辑:看起来只有较新版本的git支持。 - lzap
我们还可以编辑.git / config(或以某种方式配置它)来执行两个或更多标签的浅层克隆(如果可能需要),将浅层克隆升级为完全克隆等。 - Sam Watkins
这应该是公认的答案,恕我直言。 - Sumi Straessle


我不是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 repo都包含整个修订历史记录,因此克隆repo可以让您访问最新的提交,以及之前的所有提交,包括您正在寻找的标记。


94
2018-04-27 01:54



谢谢。我需要使用 git checkout -b b1.5.0 v1.5.0 检查'gh-pages'分支中的版本以成功推送到Github Pages。我写的这个要点可能会帮助其他人:分支/标签/子模块...... gist.github.com/1064750 - Chris Jacob
我不认为这是完全准确的(例如粘贴到终端)因为你必须 cd 成 abc/ 首先,你可以结帐分支 - Steven Lu
@StevenLu你当然是对的。我是为了概念而不是剪切和粘贴,但它可能尽可能准确。我添加了 cd。 - grossvogel


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

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

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


85
2017-07-28 02:35



不敢相信它这么复杂。猜测没人希望他们的代码被其他人使用。 - Ben
@Ben,这实际上是最简单的解决方案(需要单个命令) - Eliran Malka
@Ben为什么这么复杂?它是一个特殊用例,具有一些您希望与默认功能不同的功能。当然你需要指定它。通常的解决方案是检查整个回购 分散式 VCS。 - erikbwork
@Ben是对的。 git是复杂的af并且是由Linus写的,并且他是唯一一个“真正”理解它是如何工作的人。 xkcd.com/1597 - RyanNerd


您可以使用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. 笔记:

    • 您无需指定格式。它将被输出文件名选中。
    • 指定前缀将使代码导出到目录(如果包含尾部斜杠)。

71
2017-12-09 21:46



此命令不适用于子模块,请参阅 stackoverflow.com/questions/1591387/... - Zitrax
但是git archive也会删除版本控制,所以你不能再做另一个git checkout来升级到下一个标签。 - idbrii
是的,你失去了版本控制,但与git clone相比git存档保存的时间是绝对不可思议的! +1 - MarcH
除了那之外,这是我想要的 git archive 当我想要做的是从公共回购下载时,我会要求我输入密码。如何让它使用http而不是ssh? - robru
这失败了 fatal: Operation not supported by protocol. 和 Unexpected end of command stream 错误。或者,它也可以返回 fatal: The remote end hung up unexpectedly 错误。 - A-B-B


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


40
2018-06-25 06:28



无论是谁投票/赞成这个答案:请留下评论,并附有关于downvote的简短解释。 (只是问,因为我有点困惑。因为,afaik,这是给定问题的最佳解决方案。如果你不这么认为,我想知道为什么。) 非常感谢。 - eyecatchUp
不要试图做太多的downvotes感觉..你的回答非常好,他们的downvotes可能是没有根据的..这是SOF的生活.. - javadba


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

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

要么 只需输入

git fetch <remote>

然后检查可用的标签

git tag -l

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

git checkout tags/<tag_name>

希望这会对你有所帮助!


21
2017-09-10 18:57





我查了一下 git结帐文档,它揭示了一件有趣的事:

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

所以我们可以提到标签名称(因为标签只是一个提交的名称),如:

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

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


14
2018-04-26 14:39



或者,如果您不希望进行任何更改,并且您只想查看代码在该标记处的样子,则可以在不创建分支的情况下签出标记。您将获得一些文本,说明您处于“超级头”状态,如果您愿意,您可以随后创建分支。 - MatrixFrog


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

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


14
2018-05-12 12:23



直到你达到v1.0.10,然后坏事发生:) - Laurent Grégoire
要按时间顺序排序标记: git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags - Bob G
One-liner自动检出最新版本, 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


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

我不想像其他人建议的那样克隆远程存储库,因为我正在开发的项目很大,我想在一个干净的环境中开发。我觉得这更接近原始问题“我正在试图弄清楚如何下载A PARTICULAR TAG”而不是建议克隆整个存储库的解决方案。我不明白为什么任何人都应该拥有Windows NT和Windows 8.1源代码的副本,如果他们想要查看DOS 0.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 

如果我想要改变我的所有工作, 包括第一次改变


13
2017-12-11 17:28