2

有基于版本控制系统的一些想法和一些功能的bup备份程序(https://github.com/bup/bupgit ),用于压缩存储虚拟机映像。

bup其中有子命令,它可以显示一些像传递选项bup ls时存储在备份内部的对象的SHA1一样的哈希(相同的HEX)(相同的HEX) (在其中只有“ -s, - hash:show show for for每个文件/目录”。 ”)。但是类似sha1的哈希不等于原始文件的输出。-sman bup-lssha1sum

git根据git如何计算文件哈希?https://stackoverflow.com/a/28881708/

我测试了前缀'blob NNN\0',但sha1总和仍然不同。

bup中使用什么计算文件哈希和的方法是什么?它是线性 sha1 还是像 Merkle 树这样的树状变体?什么是目录的哈希?

bup的ls命令来源是https://github.com/bup/bup/blob/master/lib/bup/ls.py,hash 刚刚以十六进制打印,但是hash 是在哪里生成的呢?

def node_info(n, name, 
    ''' ....
    if show_hash:
        result += "%s " % n.hash.encode('hex')

bup index是在创建 bup 备份时生成的哈希(当文件通过+命令放入备份时bup save)并刚刚打印出来bup ls;或者它是否重新计算bup ls并且可以用作 bup 备份的完整性测试?

4

1 回答 1

0

bup将所有数据存储在一个裸 git 存储库中(默认情况下位于~/.bup)。因此bup,哈希计算方法完全复制了git.

但是,与 git 的一个重要区别是它bup可以将文件分成块。如果bup决定将文件拆分为块,则该文件在存储库中表示为树而不是 blob。在这种情况下bup,文件git的哈希值与相应树的哈希值一致。

以下脚本演示了这一点:

bup_hash_test

#!/bin/bash

bup init
BUPTEST=/tmp/bup_test
function test_bup_hash()
{
    bup index $BUPTEST &> /dev/null
    bup save -n buptest $BUPTEST &> /dev/null
    local buphash=$(bup ls -s buptest/latest$BUPTEST|cut -d' ' -f 1)
    echo "bup's hash: $buphash"
    echo "git's hash: $(git hash-object $BUPTEST)"
    echo git --git-dir \~/.bup cat-file -p $buphash
    git --git-dir ~/.bup cat-file -p $buphash
}

cat > $BUPTEST <<'END'
    http://pkgsrc.se/sysutils/bup
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
END

test_bup_hash

echo
echo

echo " -1" >> $BUPTEST

echo "After appending ' -1' line:"
test_bup_hash

echo
echo

echo "After replacing '-' with '#':"
sed -i 's/-/#/' $BUPTEST
test_bup_hash

输出:

$ ./bup_hash_test
Initialized empty Git repository in ~/.bup/
bup's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d
git's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d
git --git-dir ~/.bup cat-file -p b52baef90c17a508115ce05680bbb91d1d7bfd8d
    http://pkgsrc.se/sysutils/bup
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/


After appending ' -1' line:
bup's hash: c95b4a1fe1956418cb0e58e0a2c519622d8ce767
git's hash: b5bc4094328634ce6e2f4c41458514bab5f5cd7e
git --git-dir ~/.bup cat-file -p c95b4a1fe1956418cb0e58e0a2c519622d8ce767
100644 blob aa7770f6a52237f29a5d10b350fe877bf4626bd6    00
100644 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d    61


After replacing '-' with '#':
bup's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a
git's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a
git --git-dir ~/.bup cat-file -p cda9a69f1cbe66ff44ea6530330e51528563e32a
    http://pkgsrc.se/sysutils/bup
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
 #1

正如我们所看到的,当bup' 和git' 的哈希匹配时,存储库中的相应对象bup是具有预期内容的 blob。当bup' 和git' 哈希不匹配时,具有bup' 哈希的对象是一棵树。该树中 blob 的内容对应于完整文件的片段:

$ git --git-dir ~/.bup cat-file -p aa7770f6a52237f29a5d10b350fe877bf4626bd6
    http://pkgsrc.se/sysutils/bup
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
 -$ git --git-dir ~/.bup cat-file -p d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
1
于 2016-07-17T09:08:42.343 回答