我正在尝试如何下载Git存储库的特定标签,它比当前版本落后一个版本。

我看到git网页上有一个前一个版本的标记,对象名是长十六进制数。

但根据网站的说法,版本名为“标记版本1.1.5”。

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

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

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

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


当前回答

对于仅签出用于部署的给定标记,我使用例如:

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

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

注意:根据Git手册,默认情况下,传递--depth标志意味着--单个分支。

--深度,深度创建一个浅层克隆,其历史记录被截断为指定的提交次数。这意味着——单个分支,除非——没有给定单个分支来获取所有分支尖端附近的历史记录。如果要浅层克隆子模块,也可以通过浅层子模块。

其他回答

$ git clone

将为您提供整个存储库。

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

$ git checkout tags/<tag_name>

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

$ git checkout tags/<tag_name> -b <branch_name>
git clone --branch my_abc http://git.abc.net/git/abc.git

将克隆回购,并将您留在您感兴趣的标签上。

git克隆状态1.8.0的文档。

--分支还可以获取标记,并在生成的存储库中的提交时分离HEAD。

如果可以使用linux sort命令对标记进行排序,请使用以下命令:

git tag | sort -n | tail -1

例如,如果git标记返回:

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

gittag|sort-n|tail-1将输出:

v1.0.5

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

v1.0.4

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

要签出标记,请首先克隆repo,然后键入:

git checkout v1.0.4

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

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

才是真正的答案。

=

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

git rebase -i XXXXX 

因此,当我开始工作时,我会这样做

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

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

git rebase -i EMPTY 

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

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

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

OR

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

第二个变体基于标记建立一个新的分支,这样可以避免“分离的HEAD”。(git结账手册)

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