【问题标题】:Does git have a concept of log compaction?git有日志压缩的概念吗?
【发布时间】:2016-09-02 04:44:01
【问题描述】:

git version control system,是一种分布式日志(在概念上与raft 共识协议有一些相似之处)。

Raft 和其他一些系统都有log compaction 的概念,所以新客户端不需要遍历整个更改集来应用更改。

我的问题是:git有日志压缩的概念吗?

【问题讨论】:

  • Git 不使用更改日志,因此不需要日志压缩。但是您可以使 浅克隆 没有最后几个之外的提交。但是如果你需要一个完整的克隆,最好做一个比加深一个浅层的克隆。
  • 你能“压缩”删除的文件吗?

标签: git stream-compaction


【解决方案1】:

新客户端无需遍历整个更改集即可应用更改。

不,git 是快照的集合(工作树的完整副本)。
当您在 git 中访问提交时,您不必遍历所有日志或历史来构建其内容。

参见“How does git store files?”:内部存储确实使用了delta in pack files(即“压缩”的形式,而不仅仅是“日志压缩”),但每个提交仍然代表完整的工作树。

每次您在 Git 中提交或保存项目状态时,它基本上都会拍摄您当时所有文件的样子并存储对该快照的引用。
为了提高效率,如果文件没有更改,Git 不会再次存储该文件——只是一个指向它已经存储的前一个相同文件的链接。

【讨论】:

  • 那么已删除的文件是否保留在更改集中,或者您可以“记录压缩”它们吗?
  • @hawkeye 不删除的文件不再是当前提交的一部分,但它们是 git repo 历史中过去提交的一部分。
  • @hawkeye 记住 git 存储内容,而不是文件。如果您有两个内容相同的文件,则它们的内容只存储一次。如果您删除一个文件,则包含该已删除文件的树将被修改为不再列出所述已删除文件。但是 content 仍然存在(由其他文件引用)。
  • 好的 - 有没有办法压缩日志以删除该内容?
  • @hawkeye 没有要压缩的“日志”。包文件已被压缩 (stackoverflow.com/a/9478566/6309)。您所能做的就是使用git filter-branch (git-scm.com/docs/git-filter-branch) 删除您在回购历史中不再需要的元素
猜你喜欢
  • 2015-04-19
  • 2012-06-06
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2022-07-27
相关资源
最近更新 更多