Git如何记录(或更准确地说,表示)其blob的文件路径和名称,并且如何识别重命名?

8
我正在努力理解git是如何记住文件名和路径的,考虑到它只在blob中存储文件内容。Abizem在这里提供的解释是否好?(这是我目前看到的最好的解释)
接下来的问题是,Git是如何确定我们是否有相似之处的,特别是在“移动”或更新路径名称后?(如我的问题所述sub-directory renames)。我需要能够保持现有的工作流程,其中包括路径重命名作为低级个人VCS的一部分(我们有一个用于大型发布的大型铁路VCS,但没有用于日常/每小时使用的VCS)。
2个回答

10

Git 定义了四种对象(提交,标签,树,Blob)。每个对象都是由其内容哈希值来标识的。

与重命名相关的三个对象如下:

  1. Blob: 对应于一个已提交的文件,对象的内容是原始文件的压缩内容。

  2. Tree: 对应于目录列表,它包含文件名到其他对象(可能是 Blob 或 Tree)的映射,并记录访问权限。

  3. Commit: 包含提交消息、对父提交的指针(第一次提交除外)以及对 Tree 对象的指针。

因此,当您重命名文件并提交时,会创建一个新的 Tree 对象(如果它在子目录中,还会创建多个 Tree 对象),其中包含新名称到对象的映射,但对象仍然是相同的。

然而,git 不跟踪重命名,它通过比较文件内容来尝试重新发现它们。如果两个文件非常相似但具有不同的名称,则认为它是一个重命名操作。这可能会耗费时间,并且如果有大量的文件,则可能会失败。

编辑:请参阅 Git Community Book,它对 Git 如何存储信息有一个非常好的解释


在我发帖之前,我已经阅读了社区书籍,但它并没有直接回答我的问题。它在各个地方都有暗示,但从未真正说出“这就是我们存储路径和文件名的机制”。也许对于那些知道的人来说,书中的解释已经足够了,但对于不知道的人来说,他们可能无法理解。是否有地方可以提交贡献以供讨论? - Philip Oakley
文件的内容在这里详细说明:http://book.git-scm.com/7_browsing_git_objects.html 希望这能帮助您理解它。 - Sylvain Defresne
@sylvian D: 实际上, git-scm 支持我们的两个主张。在第7章关于RAW GIT部分中的创建树部分,它显示 git mktree 可以制作任意树形结构(这是我所学到的观点),而其他部分(例如第1章的Tree对象)则讨论目录和树之间的_一般_匹配(而不是在Porcelain级别上的精确1:1匹配)。在我仍然拥有“第一次读者”的“清晰度”时,我将尝试为Git-Scm起草一段文字;-) - Philip Oakley

2
为什么Git不“跟踪”重命名?
Git必须与许多不同的工作流程进行交互,例如某些更改可能来自补丁,在这种情况下重命名信息可能不可用。依赖显式的重命名跟踪使得无法合并两个树,它们做了完全相同的事情,只是一个使用补丁(创建/删除),而另一个使用其他启发式方法。
其次,跟踪重命名实际上只是跟踪内容在树中移动的特殊情况。在某些情况下,您可能更感兴趣的是查询何时添加或将函数移动到不同的文件中。通过仅依赖需要时重新创建此信息的能力,Git旨在提供一种更灵活的方式来跟踪树的变化方式。
但是,这并不意味着Git不支持重命名。Git中的差异机制支持自动检测重命名,这可以通过对git-diff-*系列命令的'-M'开关打开。重命名检测机制被git-log(1)和git-whatchanged(1)使用,因此例如,'git log -M'将给出带有重命名信息的提交历史记录。Git还支持一种有限的跨重命名合并形式。为分配责任而设计的两个工具git-blame(1)和git-annotate(1)都使用自动重命名检测代码来跟踪重命名。
作为非常特殊的情况,'git log'版本1.5.3及更高版本具有'--follow'选项,允许您在给定单个路径时跟踪重命名。这个主题的邮件由Linus发送。
Git有一个重命名命令git mv,但那只是为了方便。其效果与删除文件并添加另一个具有不同名称和相同内容的文件无法区分。
我很惊讶没有人链接到Pro Git book。我的很多学习都来自于那本书。
另外,如果你能得到这本书Version Control with Git,一定要看一下。它是一本非常好的书,特别适合初学者。 这里是链接 - Version Control with Git。 还有Git from bottom up

你知道是否有一种方法可以将-M选项包含在Git Gui呈现的“重新扫描”diff方式中吗?我需要找到一种方法,以显示这些更改为重命名,以便用户接受Git,而不是拒绝它... - Philip Oakley

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