我正在从覆盆子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肯定不再匹配了.谢谢你的任何提示!
是的,你错过了一些东西。也就是说,您没有以 Git 关注的方式损坏文件。存储在磁盘上的对象通常以对象类型开头,然后是空格,然后是大小(使用 ASCII 数字),最后是 NULL。大小表明对象有多大,这就是 Git 最终读取的全部内容。因此,像这样将数据附加到末尾实际上不会损坏对象。如果您用其他内容替换该文件的内容,那么您就会看到该问题。
\n作为参考,对象格式详细信息位于Git 用户手册中中:
\n\n\n对象存储格式
\n所有对象都有一个静态确定的“类型”,它标识对象的格式(即如何使用它,以及如何引用其他对象)。目前有四种不同的对象类型:“blob”、“tree”、“commit”和“tag”。
\n无论对象类型如何,所有对象都具有以下特征:它们都使用 zlib 压缩,并且具有一个标头,该标头不仅指定其类型,而且还提供有关对象中数据的大小信息。\xe2\x80\x99s\n值得注意的是,用于命名对象的 SHA-1 哈希是原始数据加上此标头的哈希,因此
\nsha1sum文件与文件的对象\n名称不匹配。因此,始终可以\n独立于对象的内容或类型来测试对象的总体一致性:\n可以通过验证 (a) 它们的哈希值与文件的内容匹配\n( b) 对象成功膨胀为形成序列\nof 的字节流
\n<ascii type without space> + <space> + <ascii decimal size> + <byte\\0> + <binary object data>。结构化对象可以进一步验证其结构和与其他对象的连接性。这通常是通过
\ngit fsck程序完成的,该程序生成所有对象的完整依赖关系图,并验证其内部一致性(除了通过哈希验证其表面一致性之外)。
然而,有一个有趣的交互让我认为git fsck应该更加努力地工作并注意文件末尾何时有垃圾。如果您尝试在该存储库上运行git gc,您最终会看到如下错误:
:: 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\nRun Code Online (Sandbox Code Playgroud)\n看起来如果git gc实际上无法运行,那么git fsck应该抓住这个问题。
这个问题其实很简单:没有打包的对象需要检查。那些住在.git/objects/pack. 如果您没有任何这些文件,那么您将看不到“检查对象”位。
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |