- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定以下场景。
我的期望是,已经上传的文件不会使用 git push
再次上传。但实际发生的情况是,当创建一个新分支时,所有文件(即使是数千个较小的源文件,而不是一个 10MB 的文件)都会一次又一次地上传。
我的问题:如何让 Git 检测到 10mb 的文件已经上传?你知道在推送提交时让 Git 检测服务器上已经存在的对象的解决方法/修复吗?Git 通过其 sha 检测文件,因此它应该能够检测到提交树中的某些文件已经存在于服务器上。
可能的用例:我有两个完全不同的分支,但是这两个分支共享一些公共(public)文件。当我推送一个分支时,我不想在推送第二个分支时再次上传公共(public)文件。
实际用例:我使用 Python 脚本和一些较小的数据集 (1MB - 10MB) 进行了大量机器学习实验。每次开始实验时,我都会将所有必要的实验文件添加到新的 Git 树中,并在没有分支的情况下在新的提交中使用该树。该提交完全悬而未决,然后使用新的 Git 引用(例如 refs/jobs/my-experiment-name)进行引用。当我现在用几乎相同的文件(因此有两个引用)进行两个实验时,当我推送这些引用时,Git 会再次推送所有对象。我的带宽很低,这确实减慢了我的工作速度。
$ mkdir git-test && cd git-test
$ git init
$ git remote add origin git@gitlab.com:username/projectname.git
# create dummy 10MB file
$ head -c 10000000 /dev/urandom > dummy
$ git add dummy
$ git commit -m 'init'
# first push, uploads everything - makes sense
$ git push origin master
Counting objects: 3, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 9.54 MiB | 1.13 MiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
# create new empty branch, not based from master
$ git checkout --orphan branch2
# add same files again
$ git add dummy
$ git commit -m 'init on branch2'
# this uploads now again the dummy file (10MB), although the server
# has that object alread
$ git push origin branch3
Counting objects: 3, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 9.54 MiB | 838.00 KiB/s, done.
在技术方面,我们有:
不幸的是,解决方案并没有那么简单。
每次 Git 想要同步两个存储库时,它都会构建一个包文件,其中包含所有必要的对象(如文件、提交、树)。当您执行 git push
时,远程将所有现有引用(分支)及其头部提交 SHA 发送到客户端。这是问题所在: pack protocol不是要针对每个对象使用,而是针对每次提交。因此,根据协议(protocol)本身,上面解释的行为是正确的。为了解决这个问题,我构建了一个简单的脚本,每个人都可以使用它来执行基于对象的 git push
,而不是提交。
您可以在这里找到它:https://github.com/marcj/git-objects-sync
它的作用:
当然这有一些缺点,但我在链接的 Github 存储库中描述了它们。
使用我上面的脚本,您现在得到以下内容:
marc@osx ~/git-test (branch11*) $ # added new branch11 as explained at the very top
marc@osx ~/git-test (branch11*) $ python git-sync.py refs/heads/branch11
Counting objects: 1, done.
Writing objects: 100% (1/1), 158 bytes | 158.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
marc@osx ~/git-test (branch11*) $ git push origin branch11
Everything up-to-date
如您所见,它只同步一个对象(提交对象),而不会再次同步dummy
文件及其树对象。
最佳答案
Git 仅使用引用交换来开发其 list 并打包对象。如果您推送的分支与远程没有共同的祖先,它将打包并重新上传从该分支可到达的所有对象。
顺序是这样的
Remote 将识别其数据库中已有的对象并使用现有对象。
逻辑是不时发送一些不必要的文件比在每次推送时遍历整个历史记录(可能访问和比较数万或数十万个对象)要高效得多。
关于Git 推送具有相同文件的新分支,再次上传所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48228425/
之前有人问过这个问题,但是当移动到具有相反字节序的平台(在这种情况下从大到小)时,我仍然对如何处理位域结构感到有些困惑。所以如果我有这个: typedef struct { unsigned
我之前问过这个问题here , 但它被标记为重复并已关闭。不幸的是,我被指出的答案不起作用.... 所以,再次: 我可以生成一个像这样的 eCharts4r 仪表 library(echarts4r)
关于 .NET 中对不可为空引用类型的支持存在很多问题。最大的希望是代码契约,但它仅限于对预算有限的人进行运行时检查。 对于代码契约以外的方法,Jon Skeet 写了一篇 blog post几年前,
当我通过将终止标志设置为true来停止线程'srch_slave_thread'时,(srch_slave_thread.terminate)释放线程的线程停止在析构函数的'inherited'行中,
We know that Windows 使用 CR + LF 对作为换行符,Unix(包括 Linux 和 OS X)使用单个 LF,而 MacOS 使用单个 CR。 这是否意味着 C 和 C++
This other SO question询问 WPF 中的自动完成文本框。有几个人已经构建了这些,其中给出的答案之一表明 this codeproject article . 但我还没有找到任何与
这个问题对我来说就像是噩梦的重演。该项目是使用 gpt3 训练聊天机器人,我正在试验嵌入。 我有文档,我正在尝试为不同的部分创建嵌入。根据我的测试,getEmbeddings() 似乎返回了一个值。但
我收到数据读取器初始化错误。我知道这个问题以前已经回答过很多次了,但这些案例似乎不适合我的情况。错误消息开头为“执行读取器:连接属性尚未初始化。” 程序: using System; using Sy
我知道这个问题已被多次询问和回答,但我正在抓狂,因为所提出的解决方案似乎都不起作用。 尽管有一个有效的配置文件,据我所知,它与 bundle 标识符匹配,但我收到了上述错误: 我已按照本网站上各种建议
所以我有一个小问题 这是我的文字 AFTER_2011/03/01 GREATER_2004_NOT 我想要 AFTER 和 GREATER,所以我有以下正则表达式: [A-Z]{2,}\\B 一开始
这个问题对我来说就像是噩梦的重演。该项目是使用 gpt3 训练聊天机器人,我正在试验嵌入。 我有文档,我正在尝试为不同的部分创建嵌入。根据我的测试,getEmbeddings() 似乎返回了一个值。但
我目前正在做具有图形功能的计算器应用程序。然后,我在我的计算器中有这个按钮,并将它连接到我的 Calculator2ViewController 上。此外,我将此按钮连接到另一个名为 GraphVie
昨天,我尝试以一种方式执行此操作...今天我尝试另一种方式,但仍然卡住了。我必须找到一种使用整数除法和取模来做到这一点的方法。这是我的代码,后面是错误消息。 public int evaluateFr
我大致正在处理以下内容: var i; var k = 5; $('document').ready(function () { $('#someElement').click(functio
又是realloc的问题。看来我在之前的很多realloc语句中都没有发现类似的问题。我将不胜感激您的兴趣。 我正在尝试读取格式的文本输入: g:;0,1,0,1,0 。我在源文本文件中有一组这种格式
我不知道为什么下面会给我:*“error LNK2001: unresolved external symbol 'struct Win32Vars_t win32' (?win32@@3UWin32
又是我。在我所有的问题中,我认为这是所有问题中最愚蠢的,但由于疲劳或愚蠢,我也需要一些帮助。然而,最重要的是,我这样做是为了我的一项任务,并且有一个严格的规则 - 我必须使用一个函数调用 char*
在 Ubuntu 14.04.5 上运行 MySql 5.5.53。当从文本文件导入数据时(加载数据 infil $FIL INTO TABLE &c),我收到可怕的提示,因为 secure_file
我在 Stackoverflow 中找到了大量关于如何选择组中第一行和最后一行的示例,但我无法根据需要调整它们。唉,我对 MySQL 的有限了解无济于事。 一些数据(date_time、val1 和
我遇到错误“连接必须有效并再次打开,当我更改我的 sql 查询代码时。任何人都可以帮忙吗??(编辑)在 form1 中我已经连接到数据库,在 form2 中我试图添加查询。 //IN Class1.c
我是一名优秀的程序员,十分优秀!