如何列出作者在提交范围内修改的所有文件,但仅列出文件在 Git 中发生的最后一件事?

How can I list all modified files by an author between a commit range but only with the last thing that happened to the file in Git?

命令:

 git log --oneline --name-status 
         --author=$AUTHOR $COMMIT_RANGE | grep -vE '[a-fA-F0-9]{5} ' 
         | sort | uniq | cat -n

Returns 作者在一系列提交之间修改的文件列表,状态为例如M 修改。

 1  M   a_file
 2  M   another_file
 3  M   file
 4  D   file

我怎样才能只显示文件 file 发生的最后一件事,例如这里它被删除了(D)?

我不想看到之前对文件的修改(即 M),只希望看到在该提交范围内发生的最后一件事。

感谢关注!

这是你想要做的:

git log --oneline 
        --name-status 
        --author=$AUTHOR $COMMIT_RANGE 
        | grep -vE '[a-fA-F0-9]{5} ' | sort -r | uniq -f 1 |  head -1

我修改了什么:

sort -r

反转排序,因此结果将以相反的顺序打印

head -1

取结果的第一行

uniq -f 1

获取 uniq 值跳过作为计数器的第一行,因此它不能是唯一的。

您可以调整 uniq 以仅查看特定字段:

git log --oneline --name-status 
         --author=$AUTHOR $COMMIT_RANGE | grep -vE '[a-fA-F0-9]{5} ' 
         | sort -r | uniq -f 1 | tac | cat -n

我也使用了tac来再次反转输出。不过你可以不提它。它也是一个 GNU 实用程序,您在 BSD / OS X 机器上找不到它。

这是我最终使用的适合我的命令:

git log --oneline --name-status --author=$AUTHOR $COMMIT_RANGE | \
 grep -vE '[a-fA-F0-9]{5}' | cat -n | sed -e 's/     / /g' | sed -e 's/^  *//g' | \
 sort -k 3,3 -k 1n,1n | uniq -f 2 | sed -e 's/^[0-9]\{1,\} //' | cat -n

其中 $AUTHOR 是作者姓名,$COMMIT_RANGE 是 OLDER_COMMIT_SHA1..NEWER_COMMIT_SHA1 形式的一系列提交(HEAD 也可用于 NEWER_COMMIT_SHA1)。

命令解释:

  1. 首先,在使用 grep -vEgit log 输出中删除不需要的行后,我用 cat -n;
  2. 对每行进行编号
  3. 我删除了使用 --name-status 时的 TAB git 插入和 cat -n 使用 sed -e 's/ / /g' | sed -e 's/^ *//g';
  4. 插入的初始空格
  5. 然后我首先按 第三列 排序,这样我就有了相同的文件名逐行相邻(我按文件名排序);之后,我按 第一列 数字排序(cat -n 结果)。这样我就保留了第一次出现的文件名,这是我感兴趣的文件名;
  6. 之后是时候保留唯一行而忽略前两列(因此只比较文件名)。这样 uniq 将 return 第一次出现的新文件名首先出现,不会重复出现相同文件名的其他情况;但同时每个 'group' 的第一个文件名是我感兴趣的那个,因为它有我感兴趣的最后一个 --name-status 标志,它告诉我最后发生的事情是什么那个文件(是修改?删除?等...);
  7. 然后我只删除计数,因为我需要在 uniq 命令后重新计算剩余的行并再次计数。

我要感谢 codeWizardArneVonCuniq -f 建议帮助我制定了解决方案。