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

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

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

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

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

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

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


当前回答

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 

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

其他回答

您可以使用gitarchive下载给定标记或提交id的tar球:

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

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

列表标记:查看标签0.0.10.1.0导出标记:gitarchive-o/tmp/my-repo-1.0.zip--prefix=my-repo-0.1.0/0.1.0笔记:您不需要指定格式。它将由输出文件名拾取。指定前缀将使代码导出到目录(如果包含尾随斜杠)。

我不是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可以让您访问最新的提交,以及之前的所有内容,包括您要查找的标记。

签出标记

如果您想查看标记指向的文件版本,可以执行git签出,尽管这会使存储库处于“分离的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标记略有不同,因为它将随着您的新更改而前进,因此请务必小心。

$ git clone

将为您提供整个存储库。

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

$ git checkout tags/<tag_name>

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

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

我查看了git结账文档,发现了一件有趣的事情:

git checkout-b<new_branch_name><start_point>,其中<start_point>是提交的名称开始新分支的位置;默认为HEAD

因此,我们可以将标记名(因为标记只是提交的名称)称为:

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

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