在Git中使用SHA1识别重命名和修改的文件
本文关键字:重命名 修改 文件 识别 SHA1 Git | 更新日期: 2023-09-27 18:16:06
我在底层破解git存储库,试图从中检索文件的历史记录。并且难以识别在同一版本中修改和重命名的文件。
我正在开发c#应用程序,我需要实现git log --follow FILENAME
功能。
修改很简单:如果SHA1不一致,在修改后的树中搜索具有给定路径的文件- voilom !
Rename也很简单:如果通过给定的路径搜索没有成功-寻找具有相同SHA1的对象,如果找到- volilom !
但如果没有找到它可能是文件删除和我的搜索结束,或重命名和修改在同一版本…但是如何区分这些情况呢?
我已经研究了关于Git内部的所有内容,但仍然无法找到在这种情况下该怎么做,在不同的版本中对应相同修改和重命名的文件的树对象之间可能有什么共同之处?
提前感谢您的帮助!
Git已经具备了这个功能。参见-M
/--find-renames
, -C
/--find-copies
和-C -C
/--find-copies-harder
选项到diff
(也适用于log
和show
)和--follow
选项到log
。
--find-renames
的原则是,如果它在修订中看到新文件,它会查看在该修订中删除的文件,比较它们,如果有足够相似的文件,则声明它为重命名。
Edit:更详细地说:为了检测拷贝/重命名,git首先比较两个版本,它比较文件列表。然后,对于只出现在新版本中的每个路径,它将内容与旧版本(-M
—被删除、-C
—被修改或-C
—全部)中的文件内容进行比较,如果它们足够相似(需要diff),则将其标记为重命名或适当复制。这是diff核心的一部分,所有以任何形式显示差异的命令都可以使用它,包括name-status,它不进行详细的逐行分析。在此基础上,--follow
通过逐个迭代修订来工作,使用重命名检测执行名称状态diff,并在文件被修改时输出修订,并在重命名时记住新(旧)名称。