【问题标题】:Git log without an author's commits没有作者提交的 Git 日志
【发布时间】:2013-07-25 19:00:56
【问题描述】:

我们正在开展一个项目,其中大部分提交都是由前端开发人员添加的。他主要编辑与我正在帮助的后端工作无关的 HTML、CSS、JavaScript 文件。如果我能显示git log 减去前端开发人员添加的提交,那就太好了,这样我就可以看到与后端相关的提交。

我是否可以将选项传递给git log,以允许我排除作者的所有提交?我只想排除这个开发者的提交,我仍然关心查看其他开发者的提交

【问题讨论】:

  • 嗯...这似乎是我试图解决的相反问题的解决方案。
  • 同意,木马是错误的。你需要更具体的东西。
  • @ElliotLarson:在所谓的重复中接受的答案包含有关如何解决逆问题的信息。
  • @ElliotLarson 啊,抱歉。

标签: git


【解决方案1】:

使用更灵活

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
【解决方案2】:

我认为this article 解释得很清楚。 (尽管在@trojanfoe 链接下提到了它)。主要是说:

但是,使用正则表达式排除特定作者或一组作者的提交是很棘手的,如此处所述。相反,转向 bash 和管道,您可以排除 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

这样做的一个限制是某些您想要的日志选项不可用,例如 --graph 由于多次调用 git log 的机制。

【讨论】:

  • “这篇文章”到底解释了什么?请总结一下——只有链接不是答案。
  • 我在最初的搜索中看到了这篇文章。这并不能真正解决我的问题,除非我想采用命名除一个之外的所有作者的方法,这不是一个很好的解决方案。生成的命令会很丑陋且容易出错。我可以看到自己为它创建了一个别名,然后每次我们向团队添加新成员时,我都必须更新我的别名,但不是在运行我的别名并且对为什么提交“Dave”(一个新的开发人员)没有出现。我宁愿只排除一位作者。
  • 仅仅发布没有任何相关引用的链接不是是一个好的答案。如果将来链接中断怎么办?然后答案变得完全无用。如果您在答案中引用链接中的相关信息,那么即使链接断开,我们仍然会在 Stack Overflow 上提供这些信息。
  • 对不起,伙计们 - 你的担忧看起来很合理,所以我调整了答案。虽然不是很有帮助,因为问题的作者已经提到他看到了这种方法。
【解决方案3】:

您需要 Regular expression to match a line that doesn't contain a word? Negative lookahead 才能做到这一点,但您必须要求 git 使用 --perl-regexp

git log --author='^(?!krlmlr).*$' --perl-regexp

根据git help log

--perl-regexp ... 需要编译 libpcre。

显然,并非所有gits 都有这个;对于 Ubuntu 13.04 附带的版本,这是开箱即用的。

【讨论】:

  • 所以,这看起来很优雅,可能是正确的答案。不幸的是,我的 git 版本没有使用 pcre 编译,因此运行该命令会给我一个相关的错误消息。我现在没有时间重新编译,但我会接受答案。我认为 perl-regexp 路径可能是正确的方向。谢谢。
  • @ElliotLarson:我在 Ubuntu 13.04 上,对我来说开箱即用。
  • 嗯,我在我的 Mac 上安装了带有 Homebrew 的 git。我将不得不研究为什么 Homebrew 版本在 Ubuntu 上是标准时默认没有添加 pcre。有时,如果系统上有问题,这些东西在 Homebrew 编译时会默默地“失败”,这意味着可能在预期的位置找不到一些 Perl 库,并且生成的编译标志被忽略了。
  • 太棒了。如果您想排除多个作者,可以使用--author='^(?!(author1|author2)).*$'
【解决方案4】:
git rev-list --format='%aN' --all \
| sed 'N;/\nauthorname$/d;s/commit \(.*\)/\n.*/\1/' \
| git log --stdin

当然也可以用你想要的任何头像替换上面的--all

编辑:像这样的列表/选择/处理管道是面包和黄油,这就是 git(就像许多 unix 工具一样)的构建方式。

【讨论】:

  • 由于某种原因,我无法让它工作,尽管我完全是 sed 的菜鸟。可能只是这真的很接近我正在寻找的东西,但我只是不够精通 sed 来处理命令。
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2011-02-13
  • 2012-11-18
  • 2015-03-08
相关资源
最近更新 更多