重复使用git树推送

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重复使用git树推送相关的知识,希望对你有一定的参考价值。

前言:

我正在尝试使用git的重复数据删除功能进行二进制部署。

是,我知道大多数消息人士都说这是坏主意(tm),但到目前为止,在我的测试中,这实际上很有效。

我希望每个版本都有一个分支,每个分支都是孤立的,也就是说,包含一个提交而没有任何父母。

在客户端,通过抓取,效果很好。

我执行git initgit remote add origin [url],然后仅使用git fetch origin [version]获取特定版本。

在第一次获取时,它获取所有内容,在随后的更新中,它可以重用大量对象。


问题:观察到的推送行为:

[当我进行推送时,它总是推送所有内容,而忽略所有未更改的文件。即使我用相同的提交两次将完全相同的树推送,它也会每次都推送所有内容。

据我所知,这是因为推送的提交没有任何父母。

如果存在父子关系,它将在推送时重用对象。

问题:

即使我要推送的提交是孤立的,有没有办法告诉git在推送时重用对象?

我想一种解决方法可能是具有线性提交历史记录,然后在客户端上执行git fetch --depth 1

答案

当您使用Git进行推送时,双方协商它们各自拥有哪些对象,然后客户端将所有丢失的数据推送到服务器。他们执行此操作的方式取决于协议,但从本质上讲,它们是根据使用中的引用以及双方可以从它们到达的其他项目进行协商的。

如果您有大量的孤立分支,则Git不太可能尝试遍历其他ref,因为它假定它们可能不会共享许多相同的对象。没有记录确切的详细信息,但这通常是一个安全的假设。在获取和推送期间使用的修订版遍历算法是无法自定义的,因为(a)通常效果很好,并且(b)通常发送少量重复对象是无害的。

但是,一般而言,正如大多数消息人士告诉您的那样,这是一个坏主意。由于许多原因,Git并不是一个好的部署工具。有诸如Capistrano之类的工具更适合于此并且更加灵活。

另一答案

如果创建一个虚拟提交,则该[[does有一个父级,并与该孤儿共享一棵树,然后同时推送两个树,git可以找出来:]]假设我有两个孤立分支v1和v2。 v1已经被推送到服务器,现在我想推送v2。

如果我仅执行git push origin v2:refs/heads/v2,则它将推送所有内容。

但是这可行:

从同一棵树创建一个新的虚拟提交v2-dummy= git commit-tree v2^{tree} -p v1 -m "v2"

使用相同的命令将它们都推入(这是重要的部分)git push origin v2-dummy:refs/heads/v22-dummy v2:refs/heads/v2

删除假人git push -d origin v2-dummy

以上是关于重复使用git树推送的主要内容,如果未能解决你的问题,请参考以下文章

我想轻松推送 git [重复]

《Git小书》笔记:1 前言

GIT - 推送/编写代码最多的人

Git更改未推送提交的作者[重复]

使用用户/密码的 Git https 推送在 STS4 中不起作用 [重复]

Git知识树