没有作者提交记录的 Git 日志

10
我们正在进行一个项目,大部分提交是由前端开发人员添加的。他主要编辑的是与我帮助的后端工作无关的HTML、CSS、JavaScript文件。如果我能显示排除了前端开发人员添加的git日志,那就太好了,这样我就可以获得与后端相关的提交视图。 是否有一个选项可以传递给git日志,允许我排除一个作者的所有提交?我只想排除这个开发人员的提交,但我仍然关心来自其他开发人员的提交。

1
可能是重复的问题:如何查看仅限于一个用户提交的 git 日志? - trojanfoe
3
嗯...那似乎是解决与我正在尝试解决的问题相反的问题的方法。 - Elliot Larson
同意,trojanfoe是错误的。你需要更具体的东西。 - usumoio
@ElliotLarson:所谓的重复问题中被接受的答案包含了如何解决反问题的信息。 - krlmlr
@ElliotLarson 哦,是的,抱歉。 - trojanfoe
4个回答

7
你需要一个正则表达式来匹配不包含某个单词的行?使用负向预查就可以,但是你需要要求git使用--perl-regexp(原文链接)
git log --author='^(?!krlmlr).*$' --perl-regexp

根据git help log--perl-regexp需要编译libpcre。显然,并非所有的git都有这个功能;对于Ubuntu 13.04附带的版本,此功能可直接使用。

所以,这看起来非常优雅,可能是正确的答案。不幸的是,我的git版本没有编译pcre,因此运行命令会给我一个相关的错误消息。我现在没有时间重新编译,但我会接受这个答案。我认为perl-regexp路径可能是正确的方向。谢谢。 - Elliot Larson
@ElliotLarson:我使用的是Ubuntu 13.04,对我来说开箱即用。 - krlmlr
嗯,我在我的Mac上使用Homebrew安装了git。我需要研究一下为什么Homebrew版本默认情况下不带有pcre,而Ubuntu上则是标准的。有时,如果系统存在某些问题,这些事情在Homebrew编译时会“默默失败”,这意味着可能没有在预期位置找到某些Perl库,并且生成的编译标志被省略了。 - Elliot Larson
2
太棒了。如果您想要排除多个作者,可以使用 --author='^(?!(author1|author2)).*$' - yhager

3
git rev-list --format='%aN' --all \
| sed 'N;/\nauthorname$/d;s/commit \(.*\)/\n.*/\1/' \
| git log --stdin

当然,您可以使用任何标题替换--all

注:像这样的列表/选择/处理管道是基础,这正是Git(像许多Unix工具一样)构建的方式。


我不知道为什么无法让这个工作,尽管我对SED一窍不通。也许这与我所寻找的非常接近,但是我还不够熟练,无法驾驭命令。 - Elliot Larson

0

我认为这篇文章解释得很清楚。(尽管它是在@trojanfoe的链接下提到的)。主要是说:

然而,使用正则表达式排除特定作者或一组作者的提交是棘手的,如此处所述。相反,借助 bash 和 piping,您可以通过以下方式排除由 Adam 撰写的提交:

git log --format='%H %an' |  # get a list of all commit hashes followed by the author name
grep -v Adam |             # match the name but return the lines that *don't* contain the name
cut -d ' ' -f1 |           # from this extract just the first part of the line which is commit ref
xargs -n1 git log -1       # call git log from that commit stopped after 1 commit

这种方法的局限性在于,由于多次调用git log的机制,一些你想要的日志选项(如--graph)不可用。

1
“这篇文章”到底讲了什么?请总结一下——仅提供链接不是答案。 - krlmlr
我在最初的搜索中看到了这篇文章。这并没有真正解决我的问题,除非我想采取除一个作者之外命名所有作者的方法,但这不是一个好的解决方案。生成的命令会很丑陋且容易出错。我可以为此创建一个别名,每次添加新成员时都必须更新我的别名,但在运行别名之前,我要先被新开发人员“Dave”的提交未显示而短暂困惑一下。我宁愿排除一个作者。 - Elliot Larson
仅仅发布一个没有相关引用的链接 不是 一个好的答案。如果以后链接失效怎么办?那么这个答案就变得完全没用了。如果在你的答案中引用了来自链接的相关信息,那么即使链接失效,我们也会在 Stack Overflow 上保留这些信息。 - user456814
对不起,朋友们 - 你们的担忧看起来是有道理的,因此我调整了答案。尽管如此,这并没有什么帮助,因为问题的提问者已经提到他看过这种方法了。 - antonv

0

使用起来更加灵活

git log -i --author="^((?!abc).)*$" --perl-regexp

替代

git log -i --author="^(?!abc).*$" --perl-regexp

两者的区别在于后者仅排除以abc开头的作者,例如作者abcddd,但不包括ddabcddddabc等。而前者将排除所有这些示例:)请参见this post中的查找包含或不包含某些单词的行

我已经在Windows 10上使用Git测试了这两个方法。


除了上面展示的负lookahead方法外,负lookbehind方法也可以产生相同的效果:git log -i --author="^(.(?<!abc))*$" --perl-regexp - cateyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接