2017-10-11 37 views
0

比方说,我做到以下四个提交:git是否下载文件,如果没有?

  1. ADD hello_world.txt - 1Kb的
  2. ADD hello_world.jpg - 10Mb以下
  3. REMOVE hello_world.jpg - 10Mb以下
  4. ADD hello_world2.txt - 1Kb的

如果有人检查了这个回购,他们会下载大型的“hello_world.jpg”吗?或者如果你处于最近的提交阶段,git会足够聪明地知道该文件不存在,因此只下载最近需要的文件?

+2

你错过了git的观点。关键是要有完整的历史记录。你的文件是历史的一部分吗?所以它需要有完整的记录。您可以随时要求git为您提供一个不完整的存储库,尽管它很少使用,因为它的功能有限。 – spectras

+0

Git是版本控制。所以hello_world.jpg仍然处于版本库的以前版本中。 – NullDev

+0

如果有人不需要历史记录,但只需要最新版本的文件,'git archive --repo = -o foo.tar.gz'是其中一个选项。 Github不支持'git archive',但提供一些restapi来完成同样的工作。 – ElpieKay

回答

2

默认情况下,Git将下载整个hello_world.jpg图像文件,即使它不在任何特定分支的HEAD中。原因是,如果您要检出JPG存在的早期提交,Git将需要该文件历史记录来创建相应的工作区。

因此,通常不建议提交较大的二进制文件,因为它们会成为Git历史记录中的永久性文件夹。

如果你有一个非常大的文件,并且想避免在本地引入它,你可以使用浅层克隆。或者,另一个选项可能是使用过滤器分支之类的工具从历史记录中删除文件。但最好的做法可能是首先不提交这样的文件。

+0

我希望git足够聪明,如果我不得不恢复到以前的版本,只能真正下载hello_world.jpg。 – coderama

+3

@coderama'git'是分散的。只有'clone','fetch','pull'和'push'作用于远程仓库,其他的都保持本地化,甚至不需要访问远程仓库/仓库。 – Zeta

+0

@coderama说,否则,按设计git仓库是自给自足的。你可以把它放在你的USB棒上,把它拿到那个遥远的地方,在那里工作。它也意味着只要存在一个存储库副本,所有其他存储库都可以通过复制该副本来进行恢复。在git中没有“服务器”的概念,这是人们工作流程引入的一个概念,因为将一个副本标记为权威性很方便,但git没有执行它,甚至不了解这样的概念。 – spectras

1

默认情况下,git将下载完整的历史记录。毕竟,这是可能的克隆,并检查了任何承诺:

git clone url/of/repo 
git checkout commit-of-large-file 

需要网络接入的唯一部分是初始clone。如果您不想要完整的历史记录,请使用--depth

git filter-branch可以帮助你,如果你想从历史中完全删除大文件,但这可能会导致几个问题,必须小心使用。