git fsck --full只检查目录

dns*_*wlt 7 git

我正在从覆盆子pi中提供裸git回购.我的目标是git fsck --full每晚运行以及早发现文件系统问题.我希望fsck检查"对象目录"和"对象",并查看输出,如

pi@raspi2:/media/usb/git/dw.git $ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (14538/14538), done.
Run Code Online (Sandbox Code Playgroud)

对于我的一个仓库,没有检查任何对象:

pi@raspi2:/media/usb/git/ts-ch.git.borken $ git --version
git version 2.11.0
pi@raspi2:/media/usb/git/ts-ch.git.borken $ git fsck --full
Checking object directories: 100% (256/256), done.
pi@raspi2:/media/usb/git/ts-ch.git.borken $ 
Run Code Online (Sandbox Code Playgroud)

我修改了/ objects下的一个文件(一个322kB .pdf文件)并再次运行fsck.它显示了与以前相同的消息,并且没有错误.

cd objects/86/
chmod u+w f3e6e674431ab3006cbb56fddecbdb4a7724b4 
echo "foosel" >> f3e6e674431ab3006cbb56fddecbdb4a7724b4 
chmod u-w f3e6e674431ab3006cbb56fddecbdb4a7724b4 
Run Code Online (Sandbox Code Playgroud)

所有的回购都是一样的,它们是裸的,没有特殊的配置:

pi@raspi2:/media/usb/git/ts-ch.git $ git config --list
core.repositoryformatversion=0
core.filemode=true
core.bare=true
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?为什么未检测到此修改对象?它的SHA1肯定不再匹配了.谢谢你的任何提示!

Joh*_*ter 4

关于腐败问题

\n

是的,你错过了一些东西。也就是说,您没有以 Git 关注的方式损坏文件。存储在磁盘上的对象通常以对象类型开头,然后是空格,然后是大小(使用 ASCII 数字),最后是 NULL。大小表明对象有多大,这就是 Git 最终读取的全部内容。因此,像这样将数据附加到末尾实际上不会损坏对象。如果您用其他内容替换该文件的内容,那么您就会看到该问题。

\n

作为参考,对象格式详细信息位于Git 用户手册中中:

\n
\n

对象存储格式

\n

所有对象都有一个静态确定的“类型”,它标识对象的格式(即如何使用它,以及如何引用其他对象)。目前有四种不同的对象类型:“blob”、“tree”、“commit”和“tag”。

\n

无论对象类型如何,所有对象都具有以下特征:它们都使用 zlib 压缩,并且具有一个标头,该标头不仅指定其类型,而且还提供有关对象中数据的大小信息。\xe2\x80\x99s\n值得注意的是,用于命名对象的 SHA-1 哈希是原始数据加上此标头的哈希,因此sha1sum 文件与文件的对象\n名称不匹配。

\n

因此,始终可以\n独立于对象的内容或类型来测试对象的总体一致性:\n可以通过验证 (a) 它们的哈希值与文件的内容匹配\n( b) 对象成功膨胀为形成序列\nof 的字节流<ascii type without space> + <space> + <ascii decimal size> + <byte\\0> + <binary object data>

\n

结构化对象可以进一步验证其结构和与其他对象的连接性。这通常是通过git fsck程序完成的,该程序生成所有对象的完整依赖关系图,并验证其内部一致性(除了通过哈希验证其表面一致性之外)。

\n
\n

然而,有一个有趣的交互让我认为git fsck应该更加努力地工作并注意文件末尾何时有垃圾。如果您尝试在该存储库上运行git gc,您最终会看到如下错误:

\n
:: git gc\nCounting objects: 9, done.\nDelta compression using up to 4 threads.\nCompressing objects: 100% (3/3), done.\nerror: garbage at end of loose object \'45b983be36b73c0788dc9cbcb76cbb80fc7bb057\'\nfatal: loose object 45b983be36b73c0788dc9cbcb76cbb80fc7bb057 (stored in .git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057) is corrupt\nerror: failed to run repack\n
Run Code Online (Sandbox Code Playgroud)\n

看起来如果git gc实际上无法运行,那么git fsck应该抓住这个问题。

\n

关于为什么看不到“检查对象”

\n

这个问题其实很简单:没有打包的对象需要检查。那些住在.git/objects/pack. 如果您没有任何这些文件,那么您将看不到“检查对象”位。

\n