git clone克隆本地仓库时如何直接保留原远程上游跟踪配置
问题解答
git clone 原生就支持单命令实现这个需求,不需要事后手动改remote配置,也不需要用只适合做镜像的--mirror参数,最简便的方案是用--reference参数,另外也可以通过配置参数实现完全从本地克隆的效果,具体如下:
推荐方案:--reference 参数复用本地仓库加速克隆
这个方案是最符合常规使用习惯的原生能力,你不需要修改操作逻辑,只需要调整clone命令的参数即可:
git clone --reference /work/local ssh://github /work/tmp
命令逻辑很简单:
- 你最终要跟踪的远程源直接填
ssh://github,克隆完成后/work/tmp的默认origin自然就指向这个地址,不需要任何额外配置 - 加了
--reference /work/local之后,git拉取仓库对象时会优先复用本地/work/local里已经存在的提交、文件对象,只会拉取本地和远程不一致的差异内容,克隆速度和直接从本地路径克隆几乎没有差别,不会重复走网络拉全量数据。
如果克隆完成后你不想保留和本地/work/local的关联,可以再加个--dissociate参数,克隆完成后会自动断开和本地参考仓库的引用,完全等同于直接从远程克隆的仓库:
git clone --reference /work/local --dissociate ssh://github /work/tmp
备选方案:完全从本地克隆,直接指定origin地址
如果你就是要严格走「从/work/local本地路径克隆」的流程,完全不和远程做网络交互,也可以用-o+-c参数组合一条命令完成:
git clone -o local_src -c remote.origin.url=ssh://github -c remote.origin.fetch="+refs/heads/*:refs/remotes/origin/*" /work/local /work/tmp
命令说明:
-o local_src:把本地克隆源的remote名改成local_src,不占用默认的origin名称- 后面两个
-c参数直接在新仓库里创建默认的origin远程,地址设为你要的ssh://github,fetch规则和默认生成的origin完全一致 - 整个克隆过程完全读取本地
/work/local的内容,不需要联网,克隆完成后默认的pull/push都会走origin也就是github远程地址。如果不需要保留本地源的关联,事后执行git -C /work/tmp remote remove local_src删掉就行,也比全手动改remote配置省事。
你提到的两种方案的局限
- 加
--mirror参数克隆出来的是裸仓库,没有工作区,不能直接在里面做代码编辑、提交等日常开发操作,只适合做仓库备份镜像,普通开发场景不适用 - 克隆完成后手动进目录执行
git remote set-url属于多步操作,不如上面两种单命令方案简便。
内容的提问来源于stack exchange,提问作者Robber Pen
相关产品推荐
相关产品推荐

