使用Git下载特定标签

Jack BeNimble 1892 git git-clone git-tag

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

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

Tagged release 1.1.5根据网站版本名称是" ".

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

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

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

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

besen.. 2821

$ git clone

将为您提供整个存储库.

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

$ git checkout tags/<tag_name>

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

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

  • 在进行结账时,正如Derek所说,回购进入"独立头"状态.相反,添加`-b`标志告诉git创建一个新的分支并指定一个分支名称:`git checkout <tag_name> -b <branch_name>` (53认同)
  • @hellatan你应该只在你真正想要创建一个分支时这样做,但大多数时候你可能不这样做.以"独立头"状态运行不会伤害你,如果你只是想查看一些git历史记录,可能正是你想要的. (21认同)
  • 是的.在这方面,git与颠覆不同.svn标签基本上将文件复制到新文件夹,因此您可以svn签出特定的一堆文件,而git标签只是指向特定修订的指针. (14认同)
  • 如果您有一个具有相同名称的分支和标记怎么办?如果你只是说"git checkout <name>"它会说"警告:refname'<name>'是不明确的.切换到分支'<name>'" - 你如何告诉它切换到标签? (5认同)
  • 在git版本`1.8.3.5`和更新版本中,`--branch <tag ref>`应该允许你从`<tag ref>`开始下载存储库作为repo HEAD; 结合`--depth 1`将进行浅层标签检查.请参见http://stackoverflow.com/a/21699307/1695680 (4认同)
  • 奇怪的是,ProGit v2书确切地说"你无法真正查看Git中的标签" (2认同)

小智.. 392

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

将克隆回购并留下您感兴趣的标记.

1.8.0 git clone状态的文档.

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

  • 仅供参考:同时指定`--depth 1`以避免下载任何非当前提交. (69认同)
  • 这应该是公认的答案,恕我直言. (12认同)
  • 这(至少现在)适用于标签,但最终处于分离的HEAD状态. (6认同)
  • 这确实*不*用于标签.只有分支.编辑:看起来只有较新版本的git支持. (4认同)

小智.. 167

对于仅检出给定标签进行部署,我使用例如:

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

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

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

- 深度

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

  • `--depth n`意味着`--single-branch`.你不需要两者. (11认同)
  • 不敢相信它这么复杂.猜测没人希望他们的代码被其他人使用. (10认同)
  • @Ben,这实际上是最简单的解决方案(需要单个命令) (9认同)
  • @Ben是对的.git是复杂的af并且是由Linus写的,并且他是唯一一个"真正"理解它是如何工作的人.https://xkcd.com/1597/ (9认同)
  • @Ben为什么这么复杂?它是一个特殊的用例,具有一些您希望与默认功能不同的功能.当然你需要指定它.通常的解决方案是在*distributed*vcs中检出整个repo. (3认同)
  • @RyanNerd +1 :)同样,对于花了最后一个小时的其他人来说,这只是一个注释:如果在Windows上运行此命令,请不要引用分支/标记名称。查找分支/标签时,它将原样包含引号 (2认同)

grossvogel.. 97

我不是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可以让您访问最新的提交,以及之前的所有提交,包括您正在寻找的标记.

  • 谢谢.在检查'gh-pages'分支中的版本以成功推送到Github Pages时,我需要使用`git checkout -b b1.5.0 v1.5.0`.我写的这个要点可能会帮助其他人:分支/标记/子模块... https://gist.github.com/1064750 (4认同)
  • 我不认为这是完全准确的(例如粘贴到终端),因为你必须首先将`cd`改为`abc /`才能签出一个分支 (4认同)

Chris J.. 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. 笔记:

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

  • 是的,你失去了版本控制,但与git clone相比git存档保存的时间是绝对不可思议的!+1 (9认同)
  • 此命令不适用于子模块,请参阅http://stackoverflow.com/questions/1591387/need-to-handle-git-submodules-in-git-archive (3认同)
  • 但是git archive也删除了版本控制,所以你不能再做另一个git checkout来升级到下一个标签. (3认同)

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

  • 不要试图过多地留下挫折感..你的答案非常好,他们的挫折可能没有根据.那是SOF上的生活.. (5认同)
  • 无论是downvoted/downvotes这个答案:请发表评论,并提供有关downvote的简短说明._(只是问,因为我有点困惑.因为,afaik,这是给定问题的最佳解决方案.如果你不这么认为,我想知道为什么.)_非常感谢. (3认同)

tk_.. 29

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

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

或者只是简单地输入

git fetch <remote>

然后检查可用的标签

git tag -l

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

git checkout tags/<tag_name>

希望这会对你有所帮助!


Peter Johnso.. 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

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

  • 直到你达到v1.0.10,然后坏事发生:) (25认同)
  • 让你的标签按时间顺序排序:`git for-each-ref --sort ='*authordate'--format ='%(tag)'refs/tags` (10认同)

None-da.. 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中,你无法直接更新标签(因为标签只是提交的标签),你需要签出与分支相同的标签,然后提交它,然后创建一个单独的标签.


Ivan.. 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

我不想像其他人建议的那样克隆远程存储库,因为我正在开发的项目很大,我想在一个干净的环境中开发.我觉得这更接近原始问题"我正在试图弄清楚如何下载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 

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


billwanjohi.. 8

根据彼得约翰逊的回答,我为自己创造了一个漂亮的小别名:

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

又名'git checkout最新标签'.

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

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

如果你在Mac上,brew install coreutils然后调用gsort.


Kamil Zając.. 6

尝试:

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


artamonovdev.. 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标记略有不同,因为它会随着您的新更改而向前移动,因此请务必小心。


归档时间:

查看次数:

1327795 次

最近记录:

2 年,6 月 前