如何克隆具有特定修订版的git存储库,就像我通常在Mercurial中所做的那样:
hg clone -r 3 /path/to/repository
如何克隆具有特定修订版的git存储库,就像我通常在Mercurial中所做的那样:
hg clone -r 3 /path/to/repository
Answers:
更新2自Git 2.5.0起,可以使用配置变量在服务器端启用以下描述的功能uploadpack.allowReachableSHA1InWant
,此处GitHub功能请求和GitHub提交启用了此功能。请注意,某些Git服务器默认情况下会激活此选项,例如Bitbucket Server从5.5+版本开始启用了该选项。有关如何激活配置选项的示例,请参见Stackexchange上的此答案。
更新1对于Git版本,请1.7 < v < 2.5
使用git clone和git reset,如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 fetch origin <sha1>
;似乎您需要传递命名参考,例如标记或分支名称。参见kerneltrap.org/mailarchive/git/2009/1/13/4707444
git fetch origin <SHA1>
从远程获取master并完成reset --hard
本地实例化实例后,可以使用切换到所需的任何修订版。我无法直接获取各个修订。git fetch origin <SHA1>
@artur报告说,在git 1.7中,它不起作用;你需要使用git checkout <SHA1>
后跟一个reset --hard
。
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
再次回到最近的提交
$ git pull
--depth
它,这对于大型存储库而言非常重要。此解决方案需要提取所有对象,然后将其重置为早期版本。这非常耗时并且浪费网络带宽。
克隆git存储库很合适,它会克隆整个存储库:没有一种方法只能选择一个修订版本进行克隆。但是,一旦执行git clone
,您可以通过执行签出特定的修订版checkout <rev>
。
git clone --single-branch ...
总结一下(git v。1.7.2.1):
git clone
在需要回购的地方进行操作(获取所有最新信息-我知道,不是想要的东西,我们到了那里) git checkout <sha1 rev>
你想要的转速git reset --hard
git checkout -b master
master
并切换到该分支。
git reset --hard
?该文档说:“重置索引和工作树。自<commit> [默认为HEAD,现在<sha1 rev>
是HEAD以来,对工作树中跟踪文件的任何更改都将被丢弃。” 但是到目前为止,自克隆以来我们还没有进行任何更改,所以目的是什么?它会截断当前分支<sha1 rev>
吗?
TL; DR-只需在源存储库中针对要克隆的提交创建标签,然后在fetch命令中使用该标签。您可以稍后从原始存储库中删除标签以进行清理。
好吧,它的2014年,以及查尔斯·贝利(Charles Bailey)从2010年开始接受的答案,现在看来已经完全过时了,而其他大多数(所有?)答案都涉及克隆,这是许多人希望避免的。
以下解决方案实现了OP及其它许多人正在寻找的解决方案,这是一种创建存储库副本的方法,包括历史记录,但仅限于一定的提交。
这是我在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
希望该解决方案可以继续工作几年!:-)
您可以简单地使用 git checkout <commit hash>
按此顺序
bash
git clone [URLTORepository]
git checkout [commithash]
提交哈希看起来像这样“ 45ef55ac20ce2389c9180658fdba35f4a663d204”
使用上述答案中的2个(如何克隆具有特定修订/更改集的git存储库?以及如何克隆具有特定修订/更改集的git存储库?)帮助我提出了一个明确的定义。如果要克隆到某个点,则该点必须是标记/分支,而不仅仅是SHA或FETCH_HEAD会引起混淆。遵循git fetch设置后,如果使用分支或标记名,则会得到响应,如果仅使用SHA-1,则不会响应。
这是我所做的:-从实际来源创建完整回购的完整工作克隆
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
然后在有趣的地方创建一个本地分支
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
然后创建新的空白存储库,并将其本地副本作为源
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 remote:计数对象:45493,已完成。 远程:压缩对象:100%(15928/15928),已完成。 远程:总计45493(增量27508),已重用45387(增量27463) 接收物体:100%(45493/45493),53.64 MiB | 50.59 MiB / s,已完成。 解析增量: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
这意味着我可以通过使用origin git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
来远程重建樱桃仓库,然后再将git push origin
其全部上传回新家,从而从origin_point重建仓库。
希望可以帮助某人
git fetch local_copy origin_point
与JamesGs git fetch origin refs/tags/tmptag
有何不同 ?
git fetch local_copy origin_point
离开你的状态与空reduced-repo
目录,只包含一个.git
。这些指令还缺少其他内容...
git clone https://github.com/ORGANIZATION/repository.git
(克隆存储库)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
# clone special tag/branch without history
git clone --branch=<tag/branch> --depth=1 <repository>
# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss # get the commit time
cd <dir>
git reset --hard <revision>
如果未uploadpack.allowReachableSHA1InWant=true
在服务器端进行设置,则无法获得没有历史记录的修订,而您可以为其创建标签并克隆特殊标签。
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>.
--depth=1
没有在答案中提及,所以如果您添加了此处未提及的更多内容,为什么还要说此答案有效呢?很高兴为您解决了这个问题,但是这个答案具有误导性,甚至无法部分回答问题。因此,反对票。
git clone <url> <local_dir_name>
,只需亲自尝试即可。唯一的区别是,远程(使用git remote
来显示)将被称为一些神秘的sha1序列,而不是通常的名称“ origin”。换句话说,在<sha1-of-the-commit>
这个答复中提到有没有承载任何哪个版本是从分支将被检查出服务器或牵强。
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
。这给了我修改的余地,8a28d674
而不是 896066ee
您和此答案所要求的。
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src