如何在git中查找包含(而非触及)文件的所有提交?

3
在git中,我如何从一个分支头开始工作并找到包含(不一定触及)特定文件的每个提交?请注意,“触及”版本是可以写的:
git log mybranch -- filename | grep "^commit" | awk '{print $2}'

然而,对于我现在尝试的目标,也就是构建包含特定文件(pom.xml)的所有版本,这还不够。有什么想法吗?


1
“不接触”是什么意思?您想查找文件存在但未进行任何修改的提交吗?您是否想明确省略文件存在且已修改的提交? - user229044
@meagar:没错,我只对能否在某个版本中运行Maven构建感兴趣(即pom.xml是否存在),而不关心pom.xml是否被修改过。 - Stuart Golodetz
1
其实我很感兴趣知道结果。我认为在一般情况下,你基本上是在寻找一种方法来查找满足任意条件的所有提交。你可以使用 git bisect 来连接这样的东西,以查找哪个提交引入了符合条件的更改,但我从未只需列出符合某些条件的提交。 - user229044
2
git log <mybranch> | grep "^commit" | awk '{print $2}' 可以被 git rev-list <mybranch> 替代。 - Alan Curry
2个回答

6
作为另一种方法,这似乎可以在不需要检查不同版本的情况下完成:
for REV in `git rev-list <mybranch>`
do
  HASPOM=`git ls-tree --name-only -r $REV | grep '<filename>'`
  echo "$REV $HASPOM" | awk 'NF==2{print $1}{}'
done

2
这是一个快速而简单的bash解决方案。它获取所有分支可达的提交ID列表,对其中的每个提交进行迭代,并检出每个提交。如果在检出提交后该文件存在,则打印出该提交ID。 这将通过 git checkout -f 销毁您的工作目录。在运行之前,请先隐藏您的更改。
for x in `git log --all | grep -o "[a-z0-9]\{40\}"`
do
  git checkout -f $x &> /dev/null
  if [ -e "config/pom.xml" ]
  then
    echo $x
  fi  
done

谢谢 :) 我想我可能已经找到了一种方法,可以在不检查不同版本的情况下完成它(请参见上文),但无论如何,我还是会给你答案。干杯! - Stuart Golodetz
1
@StuartGolodetz 您应该将更新作为答案添加,而不是将其编辑到您的问题中。 - user229044

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