我需要从GitHub克隆一个私有存储库,但我只想获得一个特定的标记(基本上, cloning 实际上是错误的术语)。
现在,问题是有多种选择,而且所有这些选项都没有真正解决:
curl
或wget
访问它们(至少我无法弄清楚如何)。git clone
,然后运行git checkout
以获取标签指定的版本,但随后我下载的内容超出了我的需要,我处于超级头状态,并且所有剩余的东西留在磁盘上。当然,我可以手动清理它,但是......好吧,很多工作都可以完成一项微不足道的工作。实现我想要做的最好方法是什么?
我认为我的问题不够明确,因此我添加了更多信息:我想要的不仅是获得标记标记的修订,而且我还想删除整个历史记录。基本上,好像Git从未存在过,而我所拥有的只是我的代码的单一版本。任何提示?
答案 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
开头,以压缩到原始提交。
答案 1 :(得分:2)
git fetch --all --prune
将使用所有最新的分支和标签更新您的本地存储库,一旦您在本地拥有它们,您就可以直接查看它们。
获取后,您可以使用git tag -l
列出代码,然后git checkout特定代码:git checkout tags/<tag_name>
当然,您也可以直接从远程仓库拉出而不需要提取。
你需要记住,在git中有两种类型的标签:
因此,如果您今天签出带注释的标签,并不意味着如果您现在结帐标签,它将在稍后提交相同的提交。记住它
如果要克隆标记的提示(只是最后一次提交)
git clone <repo_url> --branch <tag_name> --depth=1
答案 2 :(得分:0)
注意:git clone --single-branch --branch tag
可以工作,但是在标签链接的情况下忘记中间标签!
commit b773dde,见commit ab51783,commit 948a7fd,commit 2076353,commit 1962d9f,Jeff 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季度)
中修复