使用 gitk 查看被移动文件的完整历史
Posted
技术标签:
【中文标题】使用 gitk 查看被移动文件的完整历史【英文标题】:Using gitk to view the full history of a moved file 【发布时间】:2012-12-21 01:56:31 【问题描述】:经过大量搜索,我没有找到一个令人满意的方法,该方法易于使用,可以在 Git 中查看移动文件的完整历史,更重要的是在 Gitk 中。使用git log --follow [filePath]
甚至gitk --follow [filePath]
会为您提供文件所涉及的提交,但不会向您显示移动前文件的实际更改历史记录。因此,我想出了一个粗略但简单的解决方案。
-
对已移动的文件执行
gitk
:gitk [newFilePath]
。复制第一个提交的 SHA1 ID,这应该是文件被移动到的提交。
在复制的 SHA1 ID 上执行 gitk
:gitk [SHA1ID]
。最新的提交应该是移动发生的时间。找到移动的文件并复制旧路径。
在我们刚刚复制的 SHA1 ID 和旧文件路径上执行gitk
:gitk [SHA1ID] -- [oldFilePath]
此过程将允许您在移动之前查看文件的历史记录。如果有多次移动,则可以重复上述过程。
如果有任何更好的解决方案来解决这个问题,特别是如果有办法将这些步骤结合起来以显示完整的历史和移动,我们将不胜感激。
【问题讨论】:
【参考方案1】:如果您想查看每次提交中所做的更改,即使文件已被重命名,您可以使用git log
的选项-p
:
git log -p --follow [file/with/path]
【讨论】:
这是一个很好的解决方案!我之前没有见过其他人的解决方案使用带有“git log --follow”的-p开关。最好在 gitk 中看到,但我肯定会使用这种方法! 如果您(仍在)寻找一种 GUI 方式来做到这一点 - 试试 SourceTree(我的答案中的链接) 这似乎不适用于gitk
?我使用gitk -p --follow [file/with/path]
得到的结果与使用gitk --follow [file/with/path]
得到的结果相同【参考方案2】:
这是一个 bash 函数,它应该向您展示一个文件(使用 gitk)的所有化身的历史......如果他们需要另一个 shell,我将把它作为练习留给读者:
# bash
gitk_follow ()
while (( "$#" )); do
git log --oneline --name-status --follow $1;
shift;
done | perl -ne 'if( s^(?:[ACDMRTUXB]|R\d+)\s+ ) s\s+\ng; print; ' | sort -u
# used as:
gitk $(gitk_follow some_file)
更新:
改用 perl 是因为我没有足够关注上一个版本中 git log 的输出。
【讨论】:
非常好,谢谢!我不得不将它与--
一起使用,不过:gitk -- $(gitk_follow some_file)
。【参考方案3】:
另一种选择是使用由 Atlassian 开发的 SourceTree 应用程序 (GUI)。在应用程序中,您可以右键单击该文件并选择“Log Selected ...”
.
在弹出窗口中,它允许您“关注重命名的文件”:
我也使用GitHub for Mac,但还没有看到那里的那种功能。
(我不隶属于他们中的任何一个!)
【讨论】:
没有可用的 Linux 变种吗?【参考方案4】:一个更简单的函数,使用不同的 git log 选项和 awk 来精确文件名(包括 gitk 需要的“--”):
# bash
gitk_follow ()
while (( "$#" )); do
git log --pretty="" --name-status --follow $1;
shift;
done | awk 'print $NF' | sort -u
# used as:
gitk -- $(gitk_follow some_file)
【讨论】:
两条建议,将第一行改为:#!/usr/bin/env bash
。最后一行应该接受一个命令行参数:gitk -- $(gitk_follow $1)
以上是关于使用 gitk 查看被移动文件的完整历史的主要内容,如果未能解决你的问题,请参考以下文章
如何将分支内容移动到另一个存储库保留历史记录并避免复制原始存储库的完整历史记录?