如何在git中找到包含(不触摸)文件的所有提交?

时间:2012-08-31 15:38:08

标签: git

在git中,我如何从分支头开始工作并找到包含(不一定触及)特定文件的每个提交? “触摸”版本可以写:

git log mybranch -- filename | grep "^commit" | awk '{print $2}'

但是,对于我正在尝试做的事情,即构建包含特定文件(pom.xml)的所有修订版,这还不够。有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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