git - git如何存储重复文件?

标签 git

我们有一个 Git 存储库,其中包含 SVM AI 输入数据和结果。每次我们运行一个新模型时,我们都会为该模型创建一个新的根文件夹,以便我们可以随着时间的推移组织我们的结果:

/run1.0
  /data
    ... 100 mb of data
  /classification.csv
  /results.csv
  ...
/run2.0
  /data
    ... 200 mb of data (including run1.0/data)
  /classification.csv
  /results.csv
  ...

当我们构建新模型时,我们可能会从之前的运行中提取数据(大型 .wav 文件)。这意味着我们的数据文件夹 2.0 可能包含 1.0/data 中的所有文件以及我们可能收集的其他数据。

如果我们保持这种状态, repo 很容易超过 1 GB。

Git 是否有办法识别重复的二进制文件并将它们仅存储一次(例如像符号链接(symbolic link)一样)?如果没有,我们将重新设计数据的存储方式。

最佳答案

我可能不会解释得很正确,但我的理解是,每个提交只存储一个树结构,表示项目的文件结构,并带有指向存储在对象子文件夹中的实际文件的指针。 Git 使用文件内容的 SHA1 哈希来创建文件名和子文件夹,例如,如果文件内容创建了以下哈希:

0b064b56112cc80495ba59e2ef63ffc9e9ef0c77

它将被存储为:

.git/objects/0b/064b56112cc80495ba59e2ef63ffc9e9ef0c77

前两个字符用作目录名,其余字符用作文件名。

结果是,即使您有多个内容相同但名称不同或位于不同位置或来自不同提交的文件,也只会保存一个副本,但在每个提交树中都有多个指向它的指针。

关于git - git如何存储重复文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29947825/

相关文章:

git - 如何从git获取特定内核版本到外向数字

git - 内部开发使用 git 的工作流程描述

git filter-branch --msg-filter 重写推送的提交消息

git - 如何使用 bitbucket-api 提取代码审查时给出的内联注释

git - 大量git历史记录重写后如何同步本地历史记录?

git pull --rebase - 解决冲突后如何继续

git - git log --decorate : (HEAD -> master) vs (HEAD, master 的输出差异)

git - git 中的全局和本地配置有什么区别?

svn - 如何创建一个分支为 "subproject"的 git clone?

git - 在 git : understanding it for once and for all 中删除远程分支