Git 使用 --depth

背景

在我们拉取 Git repo 时,如果不需要大量的日志记录,只想获取某个分支或者某次提交下的文件状态,可以借助 depth=1 参数实现。

使用

在使用 git clone 时直接携带 depth:

1
2
3
4
5
*# 实现默认分支的拉取*
git clone --depth **1** xxx.git

*# 某个分支/标签*
git clone --depth **1** -b "branch_name/tag_name" xxx.git

其中 depth 指定的是 commit 的深度,指定 1 则表示只拉取一次 commit,就是某次提交的完整状态。如果指定 2,就表示只想更深一层的 commit

此处借助 vue 仓库作为参考:

默认状态

默认拉取主分支:

1
git clone --depth **1** https://github.com/vuejs/vue.git

进入 vue,查看日志:

1
git log --all

只有一次提交:

1
2
commit c1740aca77170d0bc5ff7972bd05933ed307321c (grafted, HEAD -> dev, origin/dev, origin/HEAD)
...

但实际上其有多次提交,我们还可以针对某次提交进行拉取。

拉取某次提交

实际上此操作与 depth 参数无关,只做案例。

  • -branch 接受 Tag Name 参数,需要对 commit 打标签才可以直接操作,如果需要直接使用 commit,可能需要全量拉取后在 git checkout 获取。

此处我们尝试使用拉取 v2.6.0 ,该分支的 commit id 为 8554831:

1
git clone --depth **1** -b v2.6.0 https://github.com/vuejs/vue.git

获取其他内容

在使用了 git clone --depth 1 拉取仓库的前提下,可以通过 git pull --depth x 或者 git fetch --depth x 可以获取当前提交之前的 x 层日志。

但如果使用 git branch -a 并不能查看到远程的分支,如果我们需要使用到远程的所有分支,或者说获取到某个远程的分支,应该怎么操作呢?

获取全部分支

需要从远程拉取当前分支或提交之前的所有记录,同时还会将远程的分支信息以及标签信息都同步到本地来,以便进行后续操作。

其实该需求就是将单一记录的仓库转换成完整的仓库,git 提供 unshallow 参数用以实现该功能。

1
2
3
git pull --unshallow
*# or*
git fetch --unshallow

此时将会成远程拉取完整信息,git pull --unshallow 最终的结果与默认使用 git clone 仓库的效果一致。

当然这个过程也会十分漫长。

小结

参数 depth 与 branch 可以用于 git 拉取代码包括但不限于 clone 与 submodule add 操作当中,有时候我们需要定制些其他操作,需要执行获取其他分支或者抓取其他记录,都需要借用 git 相关的参数实现。

然而这些指令不不存在某个文档当中,哪怕你用 man git-clone 都没看见相应的提示。(当然那是文档,不是教程。)

此处做了一部分记录:

1
2
3
4
5
6
7
8
9
*# 转换为完整仓库*
git pull --unshallow

*# 获取某个分支# 在本地声明远程有一个分支叫做 dev / 或其他名称*
git remote set-branches origin 'dev'
*# 同步该分支*
git fetch --depth **1** origin dev
*# 迁出分支*
git checkout -b dev origin/dev

原始链接:Git 使用 --depth 之后

请我喝杯咖啡吧~

支付宝
微信