Git如何记录(或更可能代表)其blob的文件路径和名称,然后识别重命名?

时间:2011-05-06 22:38:53

标签: git

我正试图让git设法“记住”文件的名称及其路径,因为它只存储blob中的文件内容。 Abizem在link here中的解释是好的吗? (这是迄今为止我见过的最好的)

后续问题是,git如何确定何时具有相似性,尤其是在“移动”或路径名更新后? (根据我的Q sub-directory renames)。我需要能够维护一个现有的工作流程,该工作流程使用路径重命名作为低级个人VCS的一部分(对于大型版本,我们有一个很大的铁VCS,但是没有用于日常/小时到小时的使用)

2 个答案:

答案 0 :(得分:10)

git定义了四种对象(Commit,Tag,Tree,Blob)。在其内容的散列之后标识每个对象。

重命名涉及的三个对象是:

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

  2. 树:这对应于目录列表,它包含文件名到其他对象(blob或树)的映射,还记录了访问权限

  3. commit:这包含提交消息,指向父提交的指针(第一次提交除外)和树对象

  4. 因此,当您重命名文件并提交它时,会创建一个新的树对象(如果它位于子目录中,并且具有一个新的树对象),并且对象具有新的映射名称,但该对象是相同的。

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

    编辑:看一下Git社区手册,它有一个really good explanation关于git如何存储信息。

答案 1 :(得分:2)

Why does git not "track" renames?

  

Git必须与很多人进行互操作   不同的工作流程,例如一些   更改可以来自补丁,其中   重命名信息可能不是   可用。依赖于显式重命名   跟踪使得无法合并   两棵树完全完成了   同样的事情,除了一个人做了   补丁(创建/删除),一个人做到了   使用其他一些启发式方法。

     

在第二个注释中,跟踪重命名是   真的只是一个特殊的跟踪案例   内容如何在树中移动。在一些   在某些情况下,您可能会感兴趣   在查询添加功能时   或移动到另一个文件。只是   依靠重新创造的能力   Git的目标是在需要时提供这些信息   提供更灵活的方式   跟踪树木的变化情况。

     

然而,这并不代表Git   不支持重命名。差异   Git的机器有支持   自动检测重命名,这个   通过'-M'开关打开   git-diff- *命令族。该   重命名检测机器使用   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