【问题标题】:Using gitk to view the full history of a moved file使用 gitk 查看被移动文件的完整历史
【发布时间】:2012-12-21 01:56:31
【问题描述】:

经过大量搜索,我没有找到一个令人满意的方法,该方法易于使用,可以在 Git 中查看移动文件的完整历史,更重要的是在 Gitk 中。使用git log --follow [filePath] 甚至gitk --follow [filePath] 会为您提供文件所涉及的提交,但不会向您显示移动前文件的实际更改历史记录。因此,我想出了一个粗略但简单的解决方案。

  1. 对已移动的文件执行gitkgitk [newFilePath]。复制第一个提交的 SHA1 ID,这应该是文件被移动到的提交。
  2. 在复制的 SHA1 ID 上执行 gitkgitk [SHA1ID]。最新的提交应该是移动发生的时间。找到移动的文件并复制旧路径。
  3. 在我们刚刚复制的 SHA1 ID 和旧文件路径上执行gitkgitk [SHA1ID] -- [oldFilePath]

此过程将允许您在移动之前查看文件的历史记录。如果有多次移动,则可以重复上述过程。

如果有任何更好的解决方案来解决这个问题,特别是如果有办法将这些步骤结合起来以显示完整的历史和移动,我们将不胜感激。

【问题讨论】:

    标签: git move gitk


    【解决方案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+}{\n}g; 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)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2014-11-25
    • 2013-07-27
    • 1970-01-01
    • 2015-03-23
    • 2012-07-28
    • 2012-08-10
    相关资源
    最近更新 更多