git如何存储重复文件?

git如何存储重复文件?,git,Git,我们有一个包含SVM AI输入数据和结果的Git存储库。每次运行新模型时,我们都会为该模型创建一个新的根文件夹,以便随着时间的推移组织结果: /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.c

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

/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中的所有文件以及我们可能收集的其他数据

如果我们继续这样做,回购协议很容易就会超过千兆字节


Git是否有办法识别重复的二进制文件并只存储一次(例如,像一个符号链接)?如果没有,我们将修改数据的存储方式。

默认情况下/自身否。

Git的工作原理是创建文件的快照,而不是像其他VCS那样增加差异

编辑

正如Dave和opatut提到的,我对git如何存储文件的理解是不正确的,我对由此引起的混乱表示歉意。在做了更多的研究之后,Git将重复的文件存储为指向1个文件的指针。在接受的答复中引用VonC

。。。具有相同内容的多个文件仅存储一次

还请注意,如回答中所述,在概念上

参考:

Git认为它的数据更像是一组微型文件系统的快照。每次您提交或在Git中保存项目状态时,它基本上都会拍摄到您的所有文件当时的样子,并存储对该快照的引用。为了提高效率,如果文件没有更改,Git不会再次存储该文件,只需指向它已存储的上一个相同文件的链接即可。Git认为它的数据更像是一个快照流

然而,在存储级别上仍然使用增量,Git尝试根据BLOB的启发式选择尽可能快地生成尽可能最小的增量,有一些选项可以优化压缩。这将减少存储库的大小

同样,正如opatut在其注释输出中所测试的,重复对象只存储一次这意味着git将识别重复的二进制文件并只存储一次。这就是最初的问题所要求的。以下是处理重复文件的其他选项

其他备选方案:符号链接

您可以设置指向以前文件的符号链接,这样当您处理它们时,它们将指向同一个大文件,但是请注意,git不会跟踪符号链接指向的文件,这意味着它们将仅存储符号链接。这以牺牲可移植性为代价满足了您减少空间的需要,也就是说,如果您移动到另一台dev机器,您必须确保文件位于符号链接指向的位置。这可能不是你想要的。请参见git对符号链接所做的操作

另一个备选方案:工具

我发现了多种工具,可以帮助您实现管理二进制文件所需的功能

您可以尝试使用git附件,它基本上只跟踪最新版本的二进制文件,其余由符号链接维护,因此在某种程度上这是一种处理符号链接的更自动的方式

或者内置的git子模块和一个单独的repo来实现你想要的,你只需要获取大的二进制文件来使用它们

诚然,我没有尝试过这些选项,所以这里是参考链接,阅读更多关于它们的解释。
参考资料:

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

0b064b56112cc80495ba59e2ef63ffc9e9ef0c77
它将存储为:

.git/objects/0b/064b56112cc80495ba59e2ef63ffc9e9ef0c77
前两个字符用作目录名,其余字符用作文件名


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

即使git将文件存储一次,从而以您的方式保存您的操作,您使用VCS的方式不好,无法看到两个版本之间进行了哪些更改,从而失去了使用VCS的所有优势

您最好有一个包含文件的“run”目录,并对每个新版本进行提交(如果您想更容易地查看重要的“runs”,甚至可以使用标记)

这样,您可以在不同版本之间发送所做的工作,并改进您的工作

没有必要把一切都藏在向日葵里


你想做的是一件坏事

多好的回答啊。我开始在思想上探索符号链接的概念,但不确定有什么可用。我现在会调查的。谢谢你。@JoshJ没问题,很高兴我能帮上忙,你的恭维让我很谦卑。祝你好运!我认为,你的答案是误导性的,有点令人困惑。事实上,git认为两个具有相同SHA的文件是相同的,它们的路径并不重要。所以对于OP的问题,没关系,git不会多次存储同一个文件。请参阅Dave Sexton的答案以了解原因。@opatut我已修复了我的答案,并在我的答案中添加了您的粘贴栏和注释。抱歉给你带来困惑,OP和其他人。戴夫的答案更准确,他的答案应该被接受。我的反对票将转化为赞成票:)不过,对其他选项的研究还是不错的。有趣的。。。这很有道理,我想知道这是不是真的发生了。我得做些调查