GIT下载了什么?

4 浏览
0 Comments

GIT下载了什么?

当我克隆一个有3个分支的代码库时,GIT是否智能地只下载分支之间的更改,还是会重复下载所有分支的所有文件?此外,它是在一开始就下载所有分支的数据,还是等到我切换分支时才下载?

0
0 Comments

GIT下载的内容是什么?

GIT的最大优点之一是使用有向无环图(DAG)来跟踪变更。当你执行git pullgit fetch时,它只会下载差异(diff)。

所以回答你的问题:它只会下载你所做的3个提交。然后为你创建一个本地的DAG。在这里可以快速了解一下git基础知识。

而且,它是在一开始就下载所有分支的数据呢?还是等到我切换分支后再下载?

当你执行git clone时,会下载整个仓库,这是为了构建DAG。然后以后只会在你要求的情况下,使用git fetchgit pull下载需要的内容。

git fetch会从远程下载变更,并将其存储在.git/refs/remotes/<remote>/中。所以它不会直接放入你的working directory中。(如果你不知道什么是working directory,可以阅读一下git基础知识)。

git pull是将git fetchgit merge合并为一条命令。

一些阅读材料:

Git看起来更像是一棵树而不是图。SO问题

一个简单的介绍git的文章,解释了为什么我们使用DAG:链接

0
0 Comments

Git下载时会下载足够的内容,以便能够访问到任何分支的历史提交。如果只想下载每个分支的最新提交,或者只想下载每个分支历史的一部分(比如最近的10个提交),可以使用以下选项:

  • --depth=x
  • --shallow-since=date
  • --shallow-exclude=revision

这些选项也可以用于git fetchgit pull命令。

然而需要注意的是,Git的设计目标是高效地传输全部内容:

  • 如果一个文件在两个提交之间没有修改,它只会被下载一次
  • 所有下载的内容都会被压缩(使用zlib
  • 它有一些功能可以检测两个文件是否非常相似,只下载差异部分(而不是整个内容的两倍)
0
0 Comments

GIT下载的是项目的历史记录,其中包括所有分支的完整历史。默认情况下,使用"git clone"命令会下载所有分支的完整历史记录,以便可以在没有连接的情况下执行任何源代码控制操作。但是,可以通过给"git clone"命令添加选项来指定下载的内容,例如"--single-branch"、"--depth"和"--shallow-*"选项。这些选项可以控制下载的深度和范围。

GIT存储项目历史记录的对象有两种格式。当有新的提交时,会存储为loose objects,即每个文件的每个版本的完整副本。即使在loose form中,数据也会进行压缩,并且相同内容的文件只会存储一次。之后,对象可以切换到"packed"表示。在打包时进行了一些优化,例如找到相似的对象,并将其中较旧的对象表示为相对于较新对象的增量。

虽然一些对象可能是相对于较新提交的其他对象的增量表示,但概念上,提交是一个快照。如果使用"--depth"选项等指定只下载部分提交,仍然会得到完整的快照,而不仅仅是相对于先前提交的补丁。含有部分增量但没有足够信息来重建快照(即提交)的存储库的任何子集都被认为是损坏的。

0