如何克隆具有特定版本/变更集的git存储库?

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

hg clone -r 3 /path/to/repository 

更新为git版本> 1.7使用git clone和git reset,如Vaibhav Bajpai的回答中所述

如果你不想获取完整的存储库,那么你可能不应该使用clone 。 您始终可以使用提取select您要提取的分支。 我不是一个专家,所以我不知道-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 of this commit will be retrieved 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 clone $URL $ cd $PROJECT_NAME $ git reset --hard $SHA1 

再次回到最近的提交

 $ git pull 

克隆一个git仓库,恰当地克隆整个仓库:没有办法只select一个版本进行克隆。 但是,一旦执行git clone ,您可以通过checkout <rev>来检出特定的版本。

如果你的意思是你想从一开始就拿到某个特定点,Charles Bailey的答案是完美的。 如果你想做相反的事情,并从当前date检索历史的一个子集,你可以使用git clone --depth [N] ,其中N是你想要的历史转数。 然而:

– 深度

创build一个历史截断为指定修订版本的浅表副本。 一个浅层的存储库有一些限制(你不能从中克隆或取出,也不能从中推入或者推入),但是如果你只关心一个历史悠久的大型项目的最近历史,并且想要发送修补程序作为补丁。

总结一下(git v。1.7.2.1):

  1. 做一个定期的git clone你想要的回购(获取所有的东西 – 我知道,不是什么是想要的,我们到达那里)
  2. git checkout <sha1 rev>你想要的版本
  3. git reset --hard
  4. git checkout -b master

TL; DR – 只需要在源代码仓库中创build一个标签,以对抗要提交的提交,并在提取命令中使用该标签。 您可以稍后从原始回购中删除该标签进行清理。

那么,2014年,查尔斯·贝利(Charles Bailey)从2010年开始接受的答案现在已经过时了,其他答案中的大部分(全部)都涉及到许多人希望避免的克隆。

以下解决scheme实现了OP和其他许多人正在寻找的内容,这是创build存储库副本(包括历史logging)的一种方法,但只能达到某个提交。

下面是我用git 2.1.2版本来克隆本地仓库(也就是另一个目录中的仓库)的命令:

 # in the source repository, create a tag against the commit you want to check out git tag -m "Temporary tag" tmptag <sha1> # create a new directory and change into that directory cd somewhere_else;mkdir newdir;cd newdir # ...and create a new repository git init # add the source repository as a remote (this can be a URL or a directory) git remote add origin /path/to/original/repo # fetch the tag, which will include the entire repo and history up to that point git fetch origin refs/tags/tmptag # reset the head of the repository git reset --hard FETCH_HEAD # you can now change back to the original repository and remove the temporary tag cd original_repo git tag -d tmptag 

希望这个解决scheme能够继续工作几年! 🙂

使用上面的两个答案( 如何克隆具有特定版本/变更集的git存储库?以及如何克隆具有特定版本/变更集的git存储库? )帮助我想出一个definetive。 如果你想克隆到一个点,那么这个点必须是一个标记/分支,而不仅仅是一个SHA或FETCH_HEAD混淆。 在git fetch集合之后,如果你使用分支或者标签名,你会得到一个响应,如果你只是简单地使用SHA-1,你就不会得到响应。
以下是我所做的: – 从实际来源创build完整的回购的完整工作副本

 cd <path to create repo> git clone git@<our gitlab server>:ui-developers/ui.git 

然后在有趣的地方创build一个本地分支

 git checkout 2050c8829c67f04b0db81e6247bb589c950afb14 git checkout -b origin_point 

然后创build我的新空白回购,与我的本地副本作为其来源

 cd <path to create repo> mkdir reduced-repo cd reduced-repo git init git remote add local_copy <path to create repo>/ui git fetch local_copy origin_point 

那时我得到了这个回应。 我注意到它,因为如果你使用SHA-1来代替上面的分支,什么都不会发生,所以响应意味着它的工作

 / var / www / html / ui-hacking $ git fetch local_copy origin_point
远程:计数对象:45493,完成。
远程:压缩对象:100%(15928/15928),完成。
远程:共45493(三angular洲27508),重用45387(三angular洲27463)
接收对象:100%(45493/45493),53.64 MiB |  50.59 MiB / s,完成。
解决三angular洲:100%(27508/27508),完成。
从/ var / www / html / ui
  *分支origin_point  - > FETCH_HEAD
  * [新分支] origin_point  - > origin / origin_point

在我的情况下,我需要把它放回到gitlab,所以我做了一个新的回购

 git remote add origin git@<our gitlab server>:ui-developers/new-ui.git 

这意味着我可以通过使用git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k来重buildorigin_point的repo git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k樱桃select远程然后使用git push origin将整个地段上传回它的新家。

希望能帮助别人

我的版本是被接受和最有回报的答案的组合。 但是它有点不同,因为每个人都使用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> 

这很简单。 你只需要设置当前分支的上游

 $ git clone repo $ git checkout -b newbranch $ git branch --set-upstream-to=origin/branch newbranch $ git pull 

就这样

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

在这个序列

git clone URLTORepository

git checkout commithash

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

 git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name> 

git使用单词origin代替俗称的revision

以下是手动$ git help clone一个片段

 --origin <name>, -o <name> Instead of using the remote name origin to keep track of the upstream repository, use <name>.