使用Git下载特定标签

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

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

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

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

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

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

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

1561659 次浏览
$ git clone

将为您提供整个存储库。

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

$ git checkout tags/<tag_name>

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

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

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

git clone http://git.abc.net/git/abc.gitcd abcgit checkout my_abc

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

第二个变体基于标签建立一个新分支,它可以让您避免“分离的HEAD”。(git-check out手册)

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

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

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

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

  1. 标签列表:

    git tag
    0.0.10.1.0
  2. Export a tag:

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

    • You do not need to specify the format. It will be picked up by the output file name.
    • Specifying the prefix will make your code export to a directory (if you include a trailing slash).

我检查了git签出留档,它揭示了一件有趣的事情:

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

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

>git check out-b 1.0.2_branch1.0.2
后来,修改一些文件
>>git推送--tags

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

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

git tag | sort -n | tail -1

例如。如果git tag返回:

v1.0.1v1.0.2v1.0.5v1.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

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

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

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

git clone状态的1.8.0文档。

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

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

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

又名“git检出最新标签”。

这依赖于GNU版本的排序,它适当地处理了像lOranger指出的那样的情况:

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

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

我这样做是通过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 ; \
git fetch <gitserver> <remotetag>:<localtag>

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

我刚做了这个。首先我确定我知道标签名称的拼写。

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

这给了我一个git服务器上的标签列表可供选择。最初的海报已经知道他的标签的名字,所以这一步并不是每个人都需要的。输出看起来像这样,虽然真正的列表更长。

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.18dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_1099b5087090d9077c10ba22d99d5ce90d8a45c50a3    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

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

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

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

git rebase -i EMPTY

如果我想重新定位我所有的工作,包括第一个变化

尝试:

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

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

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

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

如果只对最新的代码感兴趣,而不是对完整的存储库感兴趣,这似乎是从远程存储库中签出代码的最快方法。

注意:根据的git手册,传递--depth标志默认意味着--single-branch

--深度

创建一个浅层克隆,其历史记录被截断为指定的提交次数。暗示--unile-分支,除非给出--no-unile-分支来获取所有分支尖端附近的历史记录。如果你想浅层克隆子模块,也可以传递--Shash-sub模块。

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

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

只需输入

git fetch <remote>

然后检查可用的标签

git tag -l

然后使用下面的命令切换到特定的标签

git checkout tags/<tag_name>

希望这对你有帮助!

签出标签

如果您想查看标记指向的文件版本,您可以执行git签出,尽管这会使您的存储库处于“分离HEAD”状态,这会产生一些不良副作用:

$ git checkout 2.0.0Note: checking out '2.0.0'.
You are in 'detached HEAD' state. You can look around, make experimentalchanges and commit them, and you can discard any commits you make in thisstate without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you maydo 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.1Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-finalHEAD is now at df3f601... add atlas.json and cover image

在“分离的HEAD”状态下,如果你进行更改然后创建提交,标签将保持不变,但你的新提交不属于任何分支,并且将无法访问,除非通过确切的提交哈希。因此,如果你需要进行更改-例如,你正在修复旧版本上的bug-你通常会想要创建一个分支:

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

如果您执行此操作并进行提交,您的版本2分支将与您的v2.0.0标签略有不同,因为它将随着您的新更改向前推进,因此请务必小心。

我做了如下

git checkout tags/20210511 -b 20210511-release

我经常使用一个

git clone  --branch <tag_name> <repo_url>