用--depth 1克隆后用git拉取更新

mat*_*tec 34 git

今天早上我对Linux源代码进行了浅层克隆

git clone --depth 1 https://github.com/torvalds/linux.git
Run Code Online (Sandbox Code Playgroud)

这导致了一个linux851Mb 的文件夹.

现在我想拉出最新的变化,但是

git pull
Run Code Online (Sandbox Code Playgroud)

开始一个似乎巨大的下载.在60Mb之后,我是3%,推断为2Gb.但是,自我克隆以来的5次提交只改变了一堆行.

难道我做错了什么?git试图下载的2Gb是什么?

mga*_*aia 47

我想你可以使用--depth 1git pull了,所以它得到所需的真实正是在最新提交的存储库.

我不知道默认行为是否会丢失所有内容,因为我git help pull显示了这个选项:

git pull --unshallow
Run Code Online (Sandbox Code Playgroud)

要么

git fetch  --unshallow
Run Code Online (Sandbox Code Playgroud)

--unshallow将浅存储库转换为完整存储库,删除浅存储库强加的所有限制.

我正在运行git version 1.8.5.2 (Apple Git-48),也许这是一些新的行为,并且在版本之间有所改变.

  • `git pull` /`git fetch`有`--unshallow`选项 (4认同)
  • 这总是让我感动.我做了`git clone repo.git --depth = 1`,然后我忘了它,我`git log`我很惊讶提交太少了.最后我记得我之前使用过`depth`选项.`git pull --unshallow`一直拯救了我的生命.谢谢! (3认同)

And*_*and 6

任何新提交都可以是merge-commit,指向树中不存在的提交吗?也许--depth 1000会更好,但仍然足够小.

  • 我不完全了解“深度”的工作原理。凭直觉,我认为“ --depth 1000”包括最后的1000次提交。但是我尝试了“ --depth 100”,最终有超过50000次提交可以追溯到2012年。 (2认同)

小智 5

文件中提交的深度.git/shallow。检索提交历史记录时,您的请求将停止在浅文件中的提交处,但如果合并到当前分支,它将遵循该分支及其背后的整个历史记录。

\n

从我的博客文章探索 Git Clone --深度

\n

如果您有一个分支结构,git clone --depth=1当 main 位于 时,您执行了以下操作c

\n
...  -  .  -  .  - [c] -  .  -  .  -  .  -  .  (main)\n         \\               /\n           .  -  .  -  .  (xyz)\n
Run Code Online (Sandbox Code Playgroud)\n

然后稍后在 处进行提取g,在 d 处合并将导致您提取几乎整个历史记录(除了b)。

\n
1000\xe2\x80\x99s of commits  -  a  -  .  - [c] -  d  -  e  -  f  -  g  (main)\n                       \\               /\n                         x  -  y  -  z  (xyz)\n
Run Code Online (Sandbox Code Playgroud)\n

我的博文对此给出了两条建议:

\n
    \n
  1. 以指定深度获取并更新您的分支:
  2. \n
\n
git fetch --depth 1 origin main\ngit reset --hard origin/main\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 克隆具有足够的历史记录,您可能不会绕过:
  2. \n
\n
git clone --shallow-since=2022-06-01 repo\n
Run Code Online (Sandbox Code Playgroud)\n