Git提交后出现“重写...(90%)”消息的含义是什么?

117
当git进行提交时,它会使用类似于“rewrite foobar.bin(76%)”的东西来重写二进制文件。这个百分比是什么意思?它是更改的百分比还是保留自旧文件的百分比。我知道git对文件使用二进制增量,但我不知道%代表了多少重写,并且在“git help commit”的帮助页面中似乎没有说明。
谢谢!

也可能与https://dev59.com/2kXRa4cB1Zd3GeqPtaFL有关。 - VonC
14
Git实际上为每个文件的每个提交存储了完整的副本(称为“blob”)。当您请求差异时,Git检索有关该文件的两个副本,并在那一刻运行差异。实际的差异没有存储在任何地方。这并不完全回答您的问题,但指出将Git视为存储“二进制增量”不太正确。 - Greg Hewgill
可能是重复问题:https://dev59.com/jGYr5IYBdhLWcg3wfKL_ - Aaron Swan
3个回答

79

这是相似度指标的一种表示方式。相似度指标是未更改行的百分比。Git 认为你的文件是文本文件。


11
我认为相似度指数与Git文件是否为文本无关。不确定,因为一些二进制文件看起来很像文本。 - Greg Hewgill

30
我认为 Martin 是正确的,该数字是相似性指数。根据 git-diff 手册:
引用如下:

相似性指数是未更改行的百分比,而不相似性指数是更改行的百分比。它是舍去小数之后的整数,后跟一个百分号。 因此,相似性指数值为 100% 仅用于两个相等的文件,而 100% 的不相似意味着旧文件中没有一行出现在新文件中。

第一次看到这个数字时,我以为我的二进制文件发生了巨大变化!

2
如果我看到一个重命名后面跟着67%,那么我的理解是文件不仅被重命名了,而且原始文件的67%仍然存在。当然,这可能意味着在重命名期间有33%的原始文件被编辑了。如果重命名是单个提交,然后再编辑文件,是否更有益?这样会给出重命名相似性指数为100%的输出吗?从理论上讲,这将意味着重命名成功,没有数据丢失。我今天第一次看到这个,我想确保我理解它的预期用途。 - Eric

-8

它试图将CR和LF重写为一致的格式。也就是说,它不把您的二进制文件视为二进制文件。要强制git正确执行此操作,请在.gitattributes中添加以下行:

*.bin -crlf -diff -merge

此页面可以得知:

所有扩展名为[.bin]的文件将不会进行回车/换行符转换,不会被差异化处理,并且合并将导致冲突,使原始文件保持不变。


17
在该问题的背景下,“重写”并不是指这个词的含义。Git 是在说:“嘿,看起来你对这个文件进行了重写,但有 76% 的内容与之前保持一致”。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接