对于庞大的回购,git push非常缓慢

时间:2018-06-03 12:01:10

标签: git github

我遇到的问题与 - git push is very slow for a branch相同 但那里的答案不符合我的情况。

我正在与一家拥有大量回购的公司GitHub打交道。我的流程如下:

1)从主人拉

2)创建新分支

3)提交

4)按分支以创建拉取请求。

当按下分支(4)时,它想要写入超过1,000,000个对象,当我做出的提交只改变1行时,大约需要3gb。

如果我转到GitHub UI并从UI创建一个与(2)中的名称相同的分支,那么推入该分支,推送只需不到一秒钟。不用说主人和我的分支之间的变化非常小(没有添加或删除大文件)。

如何让Git只推送相关数据而不是整个回购?

Windows版本2.17.0上的Git

2 个答案:

答案 0 :(得分:0)

这听起来像一个行结束问题。

如果您在Windows计算机上签出一个仓库,Unix(LF)行结尾将转换为Windows(CR LF)。
提交时,Git会认为所有文件都已更新,因为所有行结尾都会发生变化。

您可以使用此命令配置Git以便为您管理:

git config --global core.autocrlf true

答案 1 :(得分:0)

您可以尝试通过以下方式进行相同的推送:

此选项来自those paches,并在commit d5d2e93中实现,其中包括注释:

  

这些改进将使超级   大型Windows存储库。

在您的情况下应该很有趣。

请参见Exploring new frontiers for Git push performance中的“ Derrick Stolee

git push通常显示如下内容:

$ git push origin topic
Enumerating objects: 3670, done.
Counting objects: 100% (2369/2369), done.
Delta compression using up to 8 threads
Compressing objects: 100% (546/546), done.
Writing objects: 100% (1378/1378), 468.06 KiB | 7.67 MiB/s, done.
Total 1378 (delta 1109), reused 1096 (delta 832)
remote: Resolving deltas: 100% (1109/1109), completed with 312 local objects.
To https://server.info/fake.git
* [new branch] topic -> topic

“枚举”是指:

  

Git构造一个打包文件,其中包含您要尝试推送的提交以及服务器需要了解该提交的所有提交,树和Blob(统称为对象)。
  它会找到一组提交,树和Blob,以便每个可访问对象都位于该集中或已知在服务器上。

目标是找到正确的“边界”

https://devblogs.microsoft.com/devops/wp-content/uploads/sites/6/2019/05/sparse-push-commit-walk.png

  

作为有趣提交的直接父项的无趣提交形成了边界

     

旧:

     

要确定哪些树和斑点有趣,旧算法首先确定所有不感兴趣的树和斑点。

     

从边界中的每一个不感兴趣的提交开始,递归地从其根树开始走,并将所有可到达的树和斑点标记为不感兴趣。这次步行跳过了已经被标记为无趣的树,以避免再次访问图中很大的部分。

https://devblogs.microsoft.com/devops/wp-content/uploads/sites/6/2019/05/sparse-push-old-algorithm.png

  

     

旧算法是递归的:它采用一棵树并在所有子树上运行该算法。

     

新算法使用路径来减少树遍历的范围。它也是递归的,但是需要一组树。
  在开始算法时,树的集合包含了无趣的和有趣的提交的根树。

https://devblogs.microsoft.com/devops/wp-content/uploads/sites/6/2019/05/sparse-push-new-algorithm.png

  

新的树木步行以递归方式探索包含有趣和无趣的树木的路径。
  在B的树中,我们有名为FG的子树。
  这两个集合都有有趣和无趣的路径,因此我们递归到每个集合中。这继续到B/FB/G中。 B/F集不会递归到B/F/MB/F/N中,而B/G集不会递归到B/G/X中,而不会递归到B/G/Y中。