从私有GitHub存储库中签出标记

时间:2015-02-04 09:54:13

标签: git github git-clone git-checkout git-tag

我需要从GitHub克隆一个私有存储库,但我只想获得一个特定的标记(基本上, cloning 实际上是错误的术语)。

现在,问题是有多种选择,而且所有这些选项都没有真正解决:

  • GitHub将标记版本作为档案提供,但无法通过curlwget访问它们(至少我无法弄清楚如何)。
  • GitHub does not support archiving存储库。
  • 我可以运行git clone,然后运行git checkout以获取标签指定的版本,但随后我下载的内容超出了我的需要,我处于超级头状态,并且所有剩余的东西留在磁盘上。当然,我可以手动清理它,但是......好吧,很多工作都可以完成一项微不足道的工作。

实现我想要做的最好方法是什么?

更新

我认为我的问题不够明确,因此我添加了更多信息:我想要的不仅是获得标记标记的修订,而且我还想删除整个历史记录。基本上,好像Git从未存在过,而我所拥有的只是我的代码的单一版本。任何提示?

3 个答案:

答案 0 :(得分:3)

认为您可以使用git clone --single-branch执行此操作:

       --[no-]single-branch
           Clone only the history leading to the tip of a single branch, either
           specified by the --branch option or the primary branch remote’s HEAD
           points at. When creating a shallow clone with the --depth option, this
           is the default, unless --no-single-branch is given to fetch the
           histories near the tips of all branches. Further fetches into the
           resulting repository will only update the remote-tracking branch for the
           branch this option was used for the initial cloning. If the HEAD at the
           remote did not point at any branch when --single-branch clone was made,
           no remote-tracking branch is created.

请注意,这表示您需要使用--branch指定分支,而不是标记。但是,--branch的文档说:

       --branch , -b 
           Instead of pointing the newly created HEAD to the branch pointed to by
           the cloned repository’s HEAD, point to  branch instead. In a
           non-bare repository, this is the branch that will be checked out.
           --branch can also take tags and detaches the HEAD at that commit in the
           resulting repository.

最后一句话说您可以将--branch与标签结合使用。我唯一不确定的是你是否可以使用--single-branch并将标记传递给--branch。我想你必须尝试确认。或者,您必须在远程存储库中创建一个分支而不是标记。

<强>更新

你现在说你也想破坏整个历史。之后再这样做。

两种方式:

危险地生活:

git clean -xdf  # Clean out everything not in git
rm -rf .git     # remove git
git init .      # put it back
git add .       # Add all the files
git commit -a -m "Eternal sunshine of the spotless mind"

生活不那么危险

git rebase --root -i # needs recent version of git

然后将每一行更改为以s开头,以压缩到原始提交。

另见How to squash all git commits into one?

答案 1 :(得分:2)

git fetch --all --prune将使用所有最新的分支和标签更新您的本地存储库,一旦您在本地拥有它们,您就可以直接查看它们。

获取后,您可以使用git tag -l列出代码,然后git checkout特定代码:git checkout tags/<tag_name>

当然,您也可以直接从远程仓库拉出而不需要提取。

你需要记住,在git中有两种类型的标签:

  • 常规标记(&#34;真实&#34; git提交)
  • 带注释的标签(可移动的SHA-1到您希望使用它的任何提交)

因此,如果您今天签出带注释的标签,并不意味着如果您现在结帐标签,它将在稍后提交相同的提交。记住它

如果要克隆标记的提示(只是最后一次提交)

git clone <repo_url> --branch <tag_name> --depth=1

答案 2 :(得分:0)

注意:git clone --single-branch --branch tag可以工作,但是在标签链接的情况下忘记中间标签!

commit b773dde,见commit ab51783commit 948a7fdcommit 2076353commit 1962d9fJeff King (peff)(2016年9月7日)。{
(由Junio C Hamano -- gitster --合并于commit 9883ec2,2016年9月15日)

  

pack-objects:遍历--include-tag

的标记链      

git pack-objects --include-tag”被告知,当我们知道发送对象C时,我们需要一个直接指向B的标记C,但也需要一个标记A指向标记B   在某些情况下,我们曾经错过了中间标记B

     

如果我们有一系列标记(例如,标记“A”指向标记“B”,指向提交“C”)会发生什么?

     

我们将剥离为“C”并意识到我们要包含标记“A”,但我们不会考虑标记“B”,导致破损包(假设“B”未被选中)。

这已在Git 2.11(2016年第4季度)

中修复