Git使用什么算法来确定某些文件是否已重命名?
这就是git status
之前几分钟产生的内容:
标有黄色框的信息不正确。实际上没有这种重命名。文件views/file/create.php
和views/file/index.php
在一组全新的两个文件创建后半小时内被真正删除 - views/logo/create.php
和views/logo/index.php
已创建。
两个文件集看起来(对Git)非常相似,但事实仍然是 - 这些不一样,重命名的文件。这是一组完整的新文件,在删除第一组文件之前约半小时在不同目录中创建。
由于Git提供的信息不正确,我想满足我的好奇心,这就是我要问的原因。
答案 0 :(得分:9)
来自Wikipedia:
重命名是隐式处理而不是显式处理。普通的 对CVS的抱怨是它使用文件名来识别它 修订历史记录,因此如果没有,则无法移动或重命名文件 要么打断历史,要么重命名历史 使历史不准确。大多数CVS后修订控制系统 通过为文件提供一个唯一的长期名称(一种inode来解决这个问题) 数字)幸存重命名。 Git没有记录这样的 标识符,这是一个优势。[34] [35]源代码 文件有时被拆分或合并以及简单地重命名,[36]和 将此记录为简单重命名会冻结不准确 描述(不可变)历史中发生的事情。 Git地址 通过在浏览快照历史记录时检测重命名来解决问题 而不是在制作快照时记录它。[37] (简单地说,给出 修订版N中的文件,修订版N-1中的同名文件是其文件 默认祖先。但是,当没有同名文件时 修订版N-1,Git搜索仅存在于修订版中的文件 N-1和新文件非常相似。)但是,确实需要 每次审查历史记录时都会有更多CPU密集型工作,以及一些数字 调整启发式的选项。这种机制并不总是如此 工作;有时是在同一次提交中使用更改重命名的文件 读取为旧文件的删除和新文件的创建。 开发人员可以通过提交重命名来解决此限制 并单独更改。