【问题标题】:Why is the size of a copied git folder on exFAT bigger than its original on ext4?为什么 exFAT 上复制的 git 文件夹的大小比 ext4 上的原始文件大?
【发布时间】:2014-10-14 06:12:43
【问题描述】:

我在 ext4 磁盘上有一个 git 文件夹(这是一个 git repo):

ytsen@ytsen-MacBookPro:~$ du -hcs ~/git
3,2M    /home/ytsen/git
3,2M    total

现在我将它复制到带有 exFAT 文件系统的 U 盘:

ytsen@ytsen-MacBookPro:~$ cp -r ~/git /media/ytsen/USB\ Flash/git3
cp: preserving permissions for ‘/media/ytsen/USB Flash/git3/hooks’: Function not implemented
cp: preserving permissions for ‘/media/ytsen/USB Flash/git3/objects/49’: Function not implemented
cp: preserving permissions for ‘/media/ytsen/USB Flash/git3/objects/68’: Function not implemented

<snip>

现在这个文件夹的大小要大得多:

ytsen@ytsen-MacBookPro:~$ du -hcs /media/ytsen/USB\ Flash/git3
23M /media/ytsen/USB Flash/git3
23M total

问题: 为什么会这样,我应该担心吗?

问题: 我现在是不是文件权限有问题(参见 cp 生成的输出)?

附言。我可以从 U 盘上的副本中签出,检索文件或历史似乎完全没有问题...

【问题讨论】:

    标签: git filesystems cp


    【解决方案1】:

    集群大小和空闲空间

    文件使用的空间量不仅仅包括文件的字节。在 ext2/3/4 和基于 FAT 的文件系统中,每个文件至少占用一个块/簇*,每个块/簇最多属于一个文件。因此,集群中不属于文件内容的任何剩余空间基本上都被浪费了。这种浪费空间的常用术语是“闲置空间”。

    浪费了多少空间,部分取决于集群/块的大小。通常,您希望文件越小,集群就越小,因为小集群意味着更少的闲置空间。

    不过,FAT 文件系统包含一个“文件分配表”(为其命名),其中说明了哪些文件占用了哪些簇。 FAT 对驱动器上的每个簇都有一个条目;如果集群是原来的一半,那么它们的数量就会增加一倍,因此 FAT 最终需要管理的条目数量是原来的两倍。因此系统倾向于支持大集群(16 KiB、32 KiB,甚至可能更高——exFAT 允许高达 32 MiB/集群,尽管这可能很不常见)。

    另一方面,在 ext4 中,事情的处理方式有所不同——以一种对块的大小/计数不太敏感的方式。所以它不太介意小块,并且通常会有 1、2 或 4 KiB 大小的块。 (大文件系统可能有更大的块,但在这一点上,空间可能不是问题。)

    话虽如此,一个 100 字节左右的文件在 ext4 文件系统上可能很容易占用 4 KiB,而在 exFAT 上可能很容易占用 32 KiB。因此,如果您有很多小文件,当您将这些文件从具有小块的 FS 移动到具有更大块的 FS 时,您会注意到空间使用量的巨大增加。

    保留权限(或...不)

    某些文件系统(包括大多数以前的 FAT 文件系统)不支持 *nix 样式的权限。其他人这样做,但尚未编写驱动程序以利用它们。在这些情况下,系统通常会使用 FS 自己的内置功能尽可能接近权限,或者只是说“搞砸了”,让任何有权访问设备的人都可以访问文件。

    (对于 exFAT,我不确定 100% 会发生什么……但我会把钱放在后者上。)

    无论哪种方式,Git 通常都不太在意;它只关心它可以读取和写入 repo 中的文件(尤其是在.git 文件夹中)。如果您有足够的权限来复制文件并在之后实际看到它们,那么您应该没问题。

    (不过有一个警告。我不确定 exFAT 是否或如何处理符号链接。如果您的存储库包含任何符号链接,我不确定会发生什么。)

    至于为什么只有这三个特定目录会给您带来问题:我冒昧地猜测您使用不同的用户名进行了几次提交和/或获取(例如,您可能说 sudo git fetch origin 或类似名称),并且作为这样做的一部分创建的文件/目录归该用户所有。您可能想检查原始目录中的这些目录,看看它们有什么不同 - 完全有可能不保留它们的权限在这里是一件的事情,实际上使 exFAT 副本比原始文件更正确.


    * “块”和“簇”基本上是一回事。但是 MS——以及它提供的关于基于 FAT 的文件系统的任何文档——喜欢称它们为“集群”。

    【讨论】:

      【解决方案2】:

      git 严重依赖硬链接,which exFAT doesn't support

      【讨论】:

        猜你喜欢
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 2016-11-04
        • 2018-04-29
        • 1970-01-01
        • 2015-01-19
        相关资源
        最近更新 更多