如何克隆具有特定版本/变更集的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):
- 做一个定期的
git clone
你想要的回购(获取所有的东西 – 我知道,不是什么是想要的,我们到达那里) -
git checkout <sha1 rev>
你想要的版本 -
git reset --hard
-
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>.