23

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

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

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

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

4

4 回答 4

13

如果您想查看每次提交中所做的更改,即使文件已被重命名,您可以使用以下选项-pgit log

git log -p --follow [file/with/path]
于 2013-01-10T05:07:33.083 回答
5

这是一个 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 的输出。

于 2014-08-01T23:32:33.423 回答
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)
于 2016-05-22T14:18:37.387 回答
0

另一种选择是使用 Atlassian 开发的SourceTree应用程序 (GUI)。在应用程序中,您可以右键单击文件并选择“Log Selected ...”

已选择日志.

在弹出窗口中,它允许您“关注重命名的文件”:

在此处输入图像描述

我也使用GitHub for Mac,但还没有看到那种功能。

(我不隶属于他们中的任何一个!)

于 2015-03-13T12:29:01.900 回答