Есть ли команда Git, которая позволила бы найти первую фиксацию, которая добавила файл, соответствующий шаблону?
Например, допустим, я хочу найти фиксацию, которая первой добавила файл, соответствующий шаблону path/prefix/*/subpath/*. Я обнаружил, что это можно сделать, комбинируя git rev-list для поиска коммитов, добавляющих файлы по фиксированному пути (например, path/prefix), повторяя коммиты, чтобы получить список файлов, которые они добавили через git diff-tree, и используя grep для поиска файлов, соответствующих заданному шаблону ( например, /subpath/):
for COMMIT in $(git rev-list \
--reverse \
--topo-order \
HEAD \
path/prefix)
do
git diff-tree \
--diff-filter A \
--name-only \
--no-commit-id \
-r "${COMMIT}" |
grep -q "/subpath/" && echo "${COMMIT}" && break
done
Есть ли способ лучше?





«Лучше» в глазах ... бегуна, но вы можете сделать это с помощью git log и либо head, либо tail. Начнем с основного:
git log <options> --diff-filter=A --format=%H -- 'path/prefix/*/subpath/*'
который выводит все идентификаторы хэшей (добавьте --topo-order, если хотите, добавьте --reverse, если хотите). Затем мы просто вырезаем все, кроме последнего (если не использовать --reverse) или первого (если использовать --reverse):
(the git log command) | tail -n 1
Обычно это будет Быстрее, поскольку git log может быстро исключить некандидатов, но иногда, возможно, это может быть медленнее.
Спасибо!
git --no-pager log --diff-filter=A --format=%H --reverse --topo-order -- "path/prefix/*/subpath/*" | head -n 1в моем случае работает чуть быстрее и компактнее.