使用 --depth 1 克隆后,如何通过 git 拉取更新?

78
今天早上我做了一个 Linux 源代码的浅克隆。
git clone --depth 1 https://github.com/torvalds/linux.git

这导致了一个大小为851Mb的linux文件夹。

现在我想拉取最新更改,但是

git pull

开始一个看似很大的下载。在下载60Mb后,我只完成了3%,这样推算下去需要下载2Gb。然而,自从我克隆代码之后,只有5次提交修改了一小部分代码。

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


奇怪...我执行了相同的命令并验证了下载文件的大小,大约为135MB。我也执行了相同的pull操作,但没有下载任何新内容。你使用的是哪个版本的Git?我使用的是1.9.1版本,无法重现你的错误。 - Makoto
@Makoto 我关于下载大小的句子表述不清/错误。我已经进行了编辑。在我的情况下,实际下载可能也是135Mb。我还使用的是git版本1.9.1。 - matec
@Makoto 如果我克隆了最新版本,然后进行拉取操作,也会收到“已经是最新的”提示。因此,我想这个问题只会在克隆后远程仓库发生了更改时才会出现。 - matec
4个回答

87

我认为你也可以在git pull中使用--depth 1, 这样它就只会拉取仓库中最新提交所需的内容。

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

git pull --unshallow
或者
git fetch  --unshallow

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

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


我现在尝试了 git pull --depth 1。(之前我检查过 git status,一切都干净。)然后拉取尝试合并某些内容,但在某个点失败了。现在 git status 显示为 Unmerged pathsgit pullgit checkout 不再起作用。 - matec
4
git pull / git fetch--unshallow选项。该选项可以将已经克隆的仓库深度变为完整的克隆,以便更好地访问历史记录和分支信息。 - linquize
3
这总是让我困扰。我会输入 git clone repo.git --depth=1,然后就忘了它,当我执行 git log 时,惊讶地发现提交记录太少了。最终我记起之前使用了 depth 选项。每次都是 git pull --unshallow 拯救了我的生命。谢谢! - Șerban Ghiță
1
如果我尝试在 Linux 内核仓库上运行 pull --depth 1 命令,最终会出现 "fatal: refusing to merge unrelated histories" 的错误,而 unshallow 需要很长时间才能发挥作用。因为重新克隆更快,所以最终我只能删除整个仓库并重新克隆。 - j riv
“--unshallow” 似乎不能拉取所有分支,必须删除仓库并重新克隆而不使用“--depth 1”选项。 - angularrocks.com

7

是否有新的提交是合并提交,指向您的树中不存在的提交?也许 --depth 1000 更适合,并且仍然足够小。


大多数似乎是合并提交。我会尝试增加一些深度看看是否有帮助。 - matec
3
我不完全理解 --depth 的工作原理。直觉上,我会认为 --depth 1000 包括最后的 1000 个提交。但是我尝试了 --depth 100,结果得到了超过 50000 个提交,回溯到了 2012 年。 - matec
1
终于有了新的提交(感谢林纳斯!),所以我可以测试它。它有效:使用 --depth 100 克隆后,git pull 运行良好(从 clone 下载 950Mb,pull 后相同),而使用 --depth 1 则会导致 pull 后存储库大小显著增加。 - matec
这绝对解释了为什么使用深度1时 Linux 内核仓库无法拉取,因为 Linus 经常从其他树合并。我不完全明白更深的深度为什么会有帮助,但我猜可能会有用。 - j riv

2
深度克隆将提交放在.git/shallow文件中。当检索提交历史时,您的请求将停留在浅层文件中的提交处,但如果当前分支有合并,则会跟随该合并及其背后的整个历史记录。
来自我的博客文章《探索Git Clone --depth》
如果您有一个分支结构,当主分支处于c时进行了git clone --depth=1
...  -  .  -  .  - [c] -  .  -  .  -  .  -  .  (main)
         \               /
           .  -  .  -  .  (xyz)

之后在 g 处执行提取操作,合并到 d 会导致您几乎需要拉取整个历史记录(除了 b)。

1000’s of commits  -  a  -  .  - [c] -  d  -  e  -  f  -  g  (main)
                       \               /
                         x  -  y  -  z  (xyz)

我的博客文章提供了两个建议:

  1. 使用指定深度的Fetch来更新你的分支:
git fetch --depth 1 origin main
git reset --hard origin/main

使用足够的历史记录克隆,以避免可能的绕过:
git clone --shallow-since=2022-06-01 repo

0

只需使用

git pull --depth=50

或者指定您想要下载的深度。那就可以了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接