3

在 git 中,我如何从分支头返回并找到包含(不一定涉及)特定文件的每个提交?“touches”版本可以这样写:

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

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

4

2 回答 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
于 2013-05-19T08:54:29.200 回答
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
于 2012-08-31T16:20:55.160 回答