我如何用特定的版本克隆git存储库,就像我通常在Mercurial中做的那样:

hg clone -r 3 /path/to/repository

当前回答

你可以简单地使用git checkout <commit hash>

在这个序列中

bash git克隆[URLTORepository] Git checkout [commit]

提交哈希看起来像这样“45ef55ac20ce2389c9180658fdba35f4a663d204”

其他回答

克隆一个git存储库,恰当地说,就是克隆整个存储库:没有办法只选择一个修订版本来克隆。然而,一旦你执行了git克隆,你可以通过执行checkout <rev>来检出一个特定的修订。

从Git 2.5.0开始,下面描述的功能可以在服务器端通过配置变量uploadpack启用。allowReachableSHA1InWant,这里是GitHub特性请求和GitHub提交启用该特性。注意,一些Git服务器默认激活这个选项,例如Bitbucket Server从5.5+版本开始启用它。有关如何激活配置选项的示例,请参阅Stackexchange上的回答。

更新1对于Git版本1.7 < v < 2.5使用Git克隆和Git重置,如Vaibhav Bajpai的回答所述

如果你不想获取完整的存储库,那么你可能不应该使用clone。你可以使用fetch来选择你想要获取的分支。我不是hg专家,所以我不知道-r的细节,但在git中你可以做这样的事情。

# make a new blank repository in the current directory
git init

# add a remote
git remote add origin url://to/source/repository

# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless 
#       you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>

# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD

不需要下载整个历史,也不需要调用git init:

git clone --depth=1 URL
git fetch --depth=1 origin SHA1
git checkout SHA1
git branch -D @{-1}  # if you want to tidy up the fetched branch

这有缺点,对CB百利的回答是,你仍然会下载1个不必要的修订。但从技术上讲,它是一个git克隆(OP想要的),并且它不强制您下载某个分支的整个历史。

克隆单个分支的完整工作流程,选择提交,然后检查特定的提交…此方法需要git版本2.28.0或更高的版本才能使用选项——no-write-fetch-head,使用版本2.35.3进行测试。(如果你已经知道你想要提交的完整sha1哈希值,请跳过最后一个代码块中的第二个方法)

#Create empty git repo
mkdir repo && cd repo && git init

#add remote, configure it to track <branch>
git remote add --no-tags -t <branch> -m <branch> origin <url>

#fetch objects from remote repo
git fetch --no-write-fetch-head

#examine commits and logs to decide which one we will use
git log --oneline origin

#Once you have found the commit of interest copy the abbreviated hash or save as variable
commit=<sha1>

#rename our default branch to match remote branch
git branch -m <branch>

#set branch head to desired commit
git branch <branch> $commit

#set remote branch as upstream for <branch>
git branch -u origin <branch>

#All done time to checkout
git checkout

可以选择截断本地分支的历史记录:

git fetch --no-write-fetch-head --depth <n> ./ <branch>

要截断远程分支历史记录,可以执行以下命令,但请记住,如果你将历史记录截断为一个比你签出的提交更新的提交,git状态会告诉你,你已经与远程分支分离了<n>次提交

git fetch --no-write-fetch-head --depth <n>

如果你不需要远程跟踪,并且已经知道完整的提交散列:

mkdir repo && cd repo && git init
git remote --no-tags add origin <url>
git fetch --depth 1 --no-write-fetch-head origin <sha1>
#Set default local branch (master in this case) head to <sha1>
git branch master <sha1>
git checkout

在我看来,这个方法更好的地方在于它真正只获取一个提交。我们还避免创建FETCH_HEAD或ORIG_HEAD,使.git目录保持干净。这也使得reflog干净(只有一个条目),而不是由于git重置而有两个条目——硬提交 不需要远程跟踪和使用fetch—depth 1,它创建尽可能小的克隆(浅克隆)。

我的版本是公认的答案和最多赞的答案的结合。但它有点不同,因为每个人都使用SHA1,但没有人告诉你如何获得它

$ git init
$ git remote add <remote_url>
$ git fetch --all

现在你可以看到所有的分支&提交

$ git branch -a
$ git log remotes/origin/master <-- or any other branch

最后,您知道了所需提交的SHA1

git reset --hard <sha1>