在git log中使用路径通配符

13

我在Git仓库中有一个深层文件:

$ git ls-files | grep /Expression.java
sm/src/main/java/cl/utilities/sm/Expression.java
我想获取它的活动日志,而无需键入整个路径。基本上我想要这个输出:
$ git log --oneline -2 sm/src/main/java/cl/utilities/sm/Expression.java
2718cdc cleaned up some warnings
f30cf15 Added missing @Overrides

...但不想输入sm/src/main/java/cl/utilities/sm。我尝试了很多方法,但都没用:

$ git log -- \*/Expression.java
$ git log -- \*Expression.java
$ git log -- \*\*/Expression.java
$ git log -- '*/Expression.java'
$ git log -- '**/Expression.java'

4
git log -- */Expression.java应该可以工作,有点奇怪。 - the.malkolm
在我的Windows 7命令行中,git log "*/Expression.java"是有效的,但单引号无效。 - yoyo
3个回答

8
使用通配符,无需转义或引号:
git log -- */Expression.java

在Windows 7的cmd shell和git bash中进行了测试。

根据你的shell,你可能需要引号 -- 如果单引号不起作用,请尝试双引号。


确认现在这对我有效。看起来我是遭受了某个版本的git中存在的一些bug的影响。修复方法如http://git-blame.blogspot.com/2012/01/git-1776-1784-and-179-rc2.html所述,是https://github.com/git/git/commit/5c8eeb8。它首次出现在1.7.7.6中,在我提问的仅仅几个月前发布。 - Matt McHenry

3

从git 2.8版本(2016年3月)开始,通配符被更好地支持,可以作为pathspecrefspec使用。

查看 commit aac4fac, commit df714f8, commit 1cc777d (2016年2月10日) 由 Jeff King (peff) 提交。
(由Junio C Hamano -- gitster --commit e6a6a76中合并,于2016年2月24日)

那意味着:
  • wilcard works with pathspecs:

      git log -- "*.t"
      # or
      git log    "*.t"
    
  • wildcard works with refspecs (when searching for a commit message starting with 'b' for instance):

      git log "HEAD^{/b.*}" --
      # or
      git log "HEAD^{/b.*} 
    

你介意链接到文档或解释一下这里的“refspecs”格式到底是做什么的吗? - Razor
1
@Razor 当然可以。我已经编辑了答案,添加了所请求的链接。 - VonC

3

使用 xargs

find . -name 'Expression.java' | xargs git log --oneline -2

2
这假设文件在本地存在。如果您想记录已被删除的文件,该怎么办? - yoyo

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