如果我创建一个文件foo,touch foo然后运行shasum foo它将打印出来
da39a3ee5e6b4b0d3255bfef95601890afd80709.
无论我多久运行一次,shasum foo或者如果我在另一台计算机上运行它,它总是打印,da39a3ee5e6b4b0d3255bfef95601890afd80709因为,是的,它是完全相同内容的SHA1表示.在这种情况下空内容:)
但是,如果我执行以下步骤:
cd /some/where
mkdir demo
git init
touch foo
git add -A
git commit -m "adding foo"
Run Code Online (Sandbox Code Playgroud)
..并记住提交的SHA键(例如959c363ed4cf147725360532454bc258c964c744).
现在,当我删除demo并重复完全相同的步骤时,提交 SHA键仍然不同.这很好,确保身份很重要.
我想知道的是,git确实做了什么确保提交哈希总是唯一的,即使它们使用完全相同的内容完成相同的操作.git只是使用类似的东西uuidgen来为提交对象生成一个唯一的id,或者根据时间戳,你的mac地址,你的wifi信号等组合做一些不同的事情.
tor*_*rek 11
我想知道的是,git确实做了什么确保提交哈希总是唯一的,即使它们使用完全相同的内容完成相同的操作.
没有.如果创建相同的内容,则会获得相同的SHA-1.
但是,首先,您需要意识到提交的"相同内容"意味着 - 如果您没有意外发生SHA-1冲突1或找到破解SHA-1的方法 - 您必须创建相同的完整存储库历史记录导致并包括提交本身,包括所有相同的树,作者姓名,时间戳等.
这是因为提交的内容是你所看到的,如果你运行git cat-file -p <sha-1>在一个提交(加上标签和大小字段,说:"这个对象的类型是犯",因此不存在微不足道的方式创造,打破东西与先前提交具有相同内容的blob).这是一个例子:
$ git cat-file -p 996b0fdbb4ff63bfd880b3901f054139c95611cf
tree e760f781f2c997fd1d26f2779ac00d42ca93f534
parent 6da748a7cebe3911448fabf9426f81c9df9ec54f
parent 740c281d21ef5b27f6f1b942a4f2fc20f51e8c7e
author Junio C Hamano <gitster@pobox.com> 1406140600 -0700
committer Junio C Hamano <gitster@pobox.com> 1406140600 -0700
Sync with v2.0.3
* maint:
Git 2.0.3
.mailmap: combine Stefan Beller's emails
git.1: switch homepage for stats
Run Code Online (Sandbox Code Playgroud)
请注意,此字符串包括树及其SHA-1,包括此提交的父SHA-1,作者和时间戳,提交者和时间戳以及消息.如果更改甚至单个位试图通过改变底层的树,或使用一些不同的家长犯这个,这样的构成(S) -你会得到一个新的,不同的SHA-1,而不是996b0fdbb4ff63bfd880b3901f054139c95611cf.
所以答案是这样的:
所以理论上如果我和你在完全相同的时间使用完全相同的配置作者,电子邮件等完成相同的步骤,我们实际上会获得相同的提交SHA密钥?
是是的".但是......你必须从相同的暂存区域开始(这将成为什么tree),并且相同的父提交.如果您然后配置您的作者,电子邮件等,与其他人完全相同,并且您在同一秒创建新提交(或使用git的环境变量2来强制时间戳),您都得到了相同的新提交.
这正是我们想要的.如果你创建它,当你被命名为"我",或者我创建它,当我被命名为"我"时,如果所有其他内容都是相同的则无关紧要.因为无论谁创造它,另一个"我"都可以克隆它,然后我们也都有同样的东西.
(如果我想确定创造某些东西的"我"不会与真实的我混淆,我需要添加一些独特的东西,我知道而另一些我不知道.当然,如果我在某个地方发布这个东西,另外我知道它.但这是签名的注释标签.它们可以包含GPG签名.)
1意外哈希碰撞的可能性(对于任何一对物体;随着更多物体的上升而增加的机会)是2 160中的1 ,这是......非常小.:-)上升实际上是非常迅速的,所以当你拥有一百万个物体时,它大约是2 121个中的 1个.我在这里使用的公式是:
1 - EXP((( - (ñ*(Ñ -1)))/(2*- [R ))
其中r = 2 160,n是对象的数量.如果没有从1减去,则等式计算"安全边际",因为它是:我们不会发生意外哈希冲突的可能性.如果我们想将这个数字保持在与磁盘驱动器不会读回文件错误内容的安全边界相同的范围内 - 或者至少是磁盘制造商声称 - 我们需要将其保持在10 -18左右,这意味着我们需要避免在我们的git数据库中放置超过1.7千万亿(1.7E15)的对象.
2您可以设置许多git环境变量来覆盖各种默认值.作者和提交者的内容包括日期和电子邮件:
| 归档时间: |
|
| 查看次数: |
2653 次 |
| 最近记录: |