如何列出作者在提交范围内修改的所有文件,但仅列出文件在 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)。
命令解释:
- 首先,在使用
grep -vE
从 git log
输出中删除不需要的行后,我用 cat -n
; 对每行进行编号
- 我删除了使用
--name-status
时的 TAB git
插入和 cat -n
使用 sed -e 's/ / /g' | sed -e 's/^ *//g'
; 插入的初始空格
- 然后我首先按 第三列 排序,这样我就有了相同的文件名逐行相邻(我按文件名排序);之后,我按 第一列 数字排序(
cat -n
结果)。这样我就保留了第一次出现的文件名,这是我感兴趣的文件名;
- 之后是时候保留唯一行而忽略前两列(因此只比较文件名)。这样
uniq
将 return 第一次出现的新文件名首先出现,不会重复出现相同文件名的其他情况;但同时每个 'group' 的第一个文件名是我感兴趣的那个,因为它有我感兴趣的最后一个 --name-status
标志,它告诉我最后发生的事情是什么那个文件(是修改?删除?等...);
- 然后我只删除计数,因为我需要在
uniq
命令后重新计算剩余的行并再次计数。
我要感谢 codeWizard
、Arne
和 VonC
的 uniq -f
建议帮助我制定了解决方案。
命令:
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)。
命令解释:
- 首先,在使用
grep -vE
从git log
输出中删除不需要的行后,我用cat -n
; 对每行进行编号
- 我删除了使用
--name-status
时的 TABgit
插入和cat -n
使用sed -e 's/ / /g' | sed -e 's/^ *//g'
; 插入的初始空格
- 然后我首先按 第三列 排序,这样我就有了相同的文件名逐行相邻(我按文件名排序);之后,我按 第一列 数字排序(
cat -n
结果)。这样我就保留了第一次出现的文件名,这是我感兴趣的文件名; - 之后是时候保留唯一行而忽略前两列(因此只比较文件名)。这样
uniq
将 return 第一次出现的新文件名首先出现,不会重复出现相同文件名的其他情况;但同时每个 'group' 的第一个文件名是我感兴趣的那个,因为它有我感兴趣的最后一个--name-status
标志,它告诉我最后发生的事情是什么那个文件(是修改?删除?等...); - 然后我只删除计数,因为我需要在
uniq
命令后重新计算剩余的行并再次计数。
我要感谢 codeWizard
、Arne
和 VonC
的 uniq -f
建议帮助我制定了解决方案。