在git中,我如何从分支头开始工作并找到包含(不一定触及)特定文件的每个提交? “触摸”版本可以写:
git log mybranch -- filename | grep "^commit" | awk '{print $2}'
但是,对于我正在尝试做的事情,即构建包含特定文件(pom.xml
)的所有修订版,这还不够。有什么想法吗?
答案 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