两个git commit具有相同的// assigning variables to DOM elements
var $css = document.getElementById('ccs');
var $count = document.getElementById('count');
// adding listener to <textarea id="css"> that is saved
// on $css variable, this listener will execute a
// anonymous function everytime that the input event on
// textarea has been done
$css.addEventListener('input', function() {
// inserting on <p id="count"> using $count variable
// as html the content of:
// 1. "this" is refering to $css
// 2. ".value" is taking the current textarea value as string
// 3. ".split('\n')" is splits the current string value
// into substrings using ("\n") as separator to
// determine where to make each split.
// 4. ".length" is counting substrings
$count.innerHTML = this.value.split("\n").length
})
我看到git history默认显示git abbrev-commit是为了简化和美观。
但是,两个相同的<p id="count"></p>
<textarea class="" id="ccs" rows="15" wrap="off" style="resize: none; overflow: auto; width:100%" placeholder="Text"></textarea>
出现在一个git repo中的机会是什么?
答案 0 :(得分:5)
零。 或者更确切地说,就是您的回购中出现SHA1冲突的可能性相同。
当git命令返回缩写引用列表时,如果发现两个缩写(哈希摘要的前缀)相同,则会从完整的SHA1哈希向这些特定引用添加更多字符,直到它们不再相同为止。 / p>
答案 1 :(得分:5)
有几种不同的答案方法。一个人用数学告诉您在各种建议条件下机会的可能性。另一个是询问Git实际上是做什么的,但是当问这个问题时,答案取决于您的特定Git版本。
机会取决于缩写的长度和存储库中的对象数量。 (在某些情况下,如果您知道所需的对象类型,则在潜在匹配描述了不同对象类型的情况下,可以消除冲突的歧义。在这种情况下,您可以简单地减小值 n 在下面的公式中。)
由于StackOverflow不会格式化LaTeX,因此我在自己的(正在进行中的)书的第77页上有一个屏幕截图。我把它做的太大了,抱歉:
要找到所需的数字,请用 n 和 r 的正确值代替并评估p-bar,然后从1中减去。对象:
$ git count-objects -v
count: 49
size: 568
in-pack: 307916
packs: 40
size-pack: 176024
prune-packable: 0
garbage: 0
size-garbage: 0
此存储库大约有300,000个对象(大多数被打包;只有49个散乱的对象),因此 n 大约为30万。您的存储库当然会有所不同。
然后,为 r 插入正确的值。如果您使用 full 哈希,则 r 的值为2 160 或1461501637330902918203684832716283019655932542976。如果将哈希缩写为四个字符,则为Git接受的最小输入为2 16 或65536,因为每个字符提供4位。完整哈希的长度为40个字符,因此完整哈希公式中为160个字符。
如果您使用git rev-parse --short=number
或git log --abbrev=number --abbrev-commit
,则由您自行选择长度。如果您没有提供数字,Git会使用一个不适当的公式来选择一个数字。 1 但这并不只是使用该数字!
Modern Git 检查缩写哈希在当前数据库中是否唯一。这不是一个概率猜测,只是一个循环中执行的文字测试:
length = <whatever>
loop {
generate short hash using <length> characters
is short hash unambiguous? if so, we're done - exit the loop
increment length
}
以免与您现在拥有的物体发生碰撞 。
不幸的是,如果再添加一个对象,则新对象可能会与基于旧对象生成的缩写哈希冲突。使用上面的公式来计算此概率,知道所有现有键都不会发生冲突,再加上缩写哈希的长度所隐含的 r 值。它可能仍然相当不错,因为即使4个字符也能使您获得6536分之一。但是请注意,当您添加更多对象时,它会迅速恶化。
当Linus Torvald的第一部分代码进入后来成为Git 2.11的代码时,就存在该循环检查代码。我不确定一个人到底要走多远,但在某些非常老的Git版本中绝对不会发生。
1 从Git 2.11开始,Git使用以下事实:对于大量 n 个键, 50%的碰撞率发生在 n = sqrt( r )。 Linus Torvalds添加了以下代码:
+ if (len < 16 && !status && (flags & GET_SHA1_AUTOMATIC)) {
+ unsigned int expect_collision = 1 << (len * 2);
+ if (ds.nrobjects > expect_collision) {
+ default_automatic_abbrev = len+1;
+ return SHORT_NAME_AMBIGUOUS;
+ }
+ }
在commit e6c587c733
中表示Git 2.11。随后在commit 8e3f52d778
中进行了改进。但是50%的概率太高了。
答案 2 :(得分:3)
正如我在“ How much of a git sha is generally considered necessary to uniquely identify a change in a given codebase?”中提到的,只需致电git rev-parse --short=4
通过设置太短的长度,您将强制Git返回该存储库的保证 SHA1唯一性的实际最小长度。
获取 var foundFiles = Directory.EnumerateFiles(rootDirectory, "fileserver.config",
SearchOption.AllDirectories);
var RepositoryName = Path.GetFileName(Path.GetDirectoryName(foundFiles));
返回的sha1的最小长度,您将没有任何问题。