为什么exFAT上复制的git文件夹的大小比ext4上的原始文件大?

时间:2014-08-20 18:51:50

标签: git filesystems cp

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

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

现在我将其复制到带有exFAT文件系统的USB记忆棒:

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输出)?

PS。我可以从USB记忆棒上的副本中查看,在检索文件或历史记录时似乎没有任何问题......

2 个答案:

答案 0 :(得分:2)

群集大小和松弛空间

文件使用的空间量不仅包括文件的字节数。在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,我不是百分百肯定会发生什么......但我会把钱花在后者身上。)

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

(但有一点需要注意。我不确定exFAT是否 - 或者有多好 - 处理符号链接。如果你的回购包含任何内容,我不确定会发生什么。)

至于为什么只有那三个特定的目录给你带来了问题:我猜想你用不同的用户名做了几次提交和/或提取(例如你可能说sudo git fetch origin之类的话等等) ),作为这样做的一部分创建的文件/目录由该用户拥有。您可能想要检查原始目录中的那些目录并查看它们的不同之处 - 完全有可能不保留其权限是的事情,并且实际上使exFAT副本比原始更正确


* “块”和“簇”基本相同。但MS - 以及它在基于FAT的文件系统上提供的任何文档 - 都喜欢称它们为“集群”。

答案 1 :(得分:0)

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