Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用git真正显示重命名文件的日志?_Git - Fatal编程技术网

如何使用git真正显示重命名文件的日志?

如何使用git真正显示重命名文件的日志?,git,Git,我对git比较陌生。我以前用过颠覆 我注意到,如果文件被重命名,大多数图形化git前端和IDE插件似乎无法显示文件的历史记录。当我使用 git log --follow 在命令行中,我可以看到整个重命名日志 ()--follow开关是一个“SVN noob”取悦器;严重的Git用户不使用它: --follow是一个完全的黑客程序,旨在满足从未使用过SVN的前用户 你知道什么吗 亲子关系还是漂亮的修订图 无论如何 这不完全是基本的,但是 “遵循”的当前实施情况 这确实是一个快速的预处理过程 用螺

我对git比较陌生。我以前用过颠覆

我注意到,如果文件被重命名,大多数图形化git前端和IDE插件似乎无法显示文件的历史记录。当我使用

git log --follow
在命令行中,我可以看到整个重命名日志

()
--follow
开关是一个“SVN noob”取悦器;严重的Git用户不使用它:

--follow是一个完全的黑客程序,旨在满足从未使用过SVN的前用户 你知道什么吗 亲子关系还是漂亮的修订图 无论如何

这不完全是基本的,但是 “遵循”的当前实施情况 这确实是一个快速的预处理过程 用螺栓固定在地板上 逻辑,而不是什么 真的很完整

它被设计成一个“SVN” “noob”讨人喜欢,而不是“真正的git” “功能性”的东西。想法是 让你远离(破碎的)世界 重新命名的思维方式 事关全局


我的问题:当文件被重命名时,你们当中的核心git用户是如何获得该文件的历史记录的?“真正”的实现方式是什么?

我认为Linus point背后的主要驱动力是——有一点可以肯定——git的铁杆用户从来都不关心“文件”的历史。您将内容放在git存储库中,因为内容作为一个整体具有有意义的历史

文件重命名是“内容”在路径之间移动的一个小特例。您可能有一个函数,可以在git用户可能使用“pickaxe”功能性地跟踪的文件之间移动(例如,
log-S

其他“路径”更改包括合并和拆分文件;Git并不关心你认为重命名的文件和你认为复制(或重命名和删除)的文件,它只是跟踪你的树的完整内容。< /P>
git鼓励“全树”思维,其中有尽可能多的版本控制系统是以文件为中心的。这就是为什么git更多地引用“路径”而不是“文件名”的原因。

我遇到了与您完全相同的问题。尽管我不能给你答案,但我相信你可以阅读莱纳斯在2005年写的文章,它非常中肯,可能会给你一个关于如何处理这个问题的提示:

…我认为任何试图跟踪重命名的SCM基本上都是 除非出于内部原因(即允许有效的 Delta),因为重命名并不重要。他们帮不了你,而且 不管怎么说,它们都不是你感兴趣的东西

重要的是找到“这是从哪里来的”和git 建筑确实做得很好——比其他任何东西都好 在外面

我发现它被引用,这对您找到可行的解决方案也很有用:

在这封信中,Linus概述了一个理想的内容跟踪系统如何让您发现一段代码是如何进入当前状态的。您可以从文件中的当前代码块开始,在历史记录中查找更改文件的提交。然后检查提交的更改,以查看您感兴趣的代码块是否被它修改,因为更改文件的提交可能不会触及您感兴趣的代码块,而只触及文件的某些其他部分

当您发现在提交之前,文件中不存在代码块时,您可以更深入地检查提交。您可能会发现这是许多可能情况之一,包括:

  • 提交真正引入了代码块。提交的作者是您正在寻找其来源的酷炫功能的发明者(或引入该漏洞的犯罪方);或
  • 该代码块不存在于文件中,但它的五个相同副本存在于不同的文件中,所有这些副本在提交后都消失了。提交重构重复代码的作者通过引入一个helper函数;或
  • (作为特例)在提交之前,当前包含您感兴趣的代码块的文件本身并不存在,但确实存在另一个内容几乎相同的文件,并且您感兴趣的代码块以及文件中当时存在的所有其他内容确实存在于该另一个文件中。这件事发生后就消失了。提交的作者重命名了该文件,同时对其进行了轻微修改
  • 在git中,Linus的终极内容跟踪工具还没有完全自动化。但是大部分重要的成分已经可以得到了

    请随时向我们通报您在这方面的进展

    我注意到,如果文件被重命名,大多数图形化git前端和IDE插件似乎无法显示文件的历史记录

    您会很高兴知道一些流行的Git UI工具现在支持这一点。有几十种Git UI工具可用,因此我不会全部列出,但例如:

    • 查看文件日志时,SourceTree在左下角有一个复选框“跟随重命名的文件”
    • 在左下角的日志窗口中有一个“跟随重命名”复选框
    有关Git UI工具的更多信息:


    在Linux上,我已经验证了SmartGit和GitEye在跟踪特定文件的历史记录时能够跟踪重命名。但是,与gitk和GitEye不同,SmartGit显示了一个单独的文件视图和存储库视图(其中包含目录结构,但不包含其中包含的文件列表)

    注意:git 2.9(2016年6月)将大大改善
    git日志的“bug”性质——请遵循

    参见作者(2016年3月30日)
    (于2016年4月13日被合并)

    diffcore:修复重命名检测期间相同文件的迭代顺序 如果两个路径“
    dir/A/file
    ”和“
    dir/B/file
    ”的内容相同 并且父目录被重命名,例如.
    g
    
    renamed:    dir/B/file -> other-dir/A/file
    renamed:    dir/A/file -> other-dir/B/file