Вывести список всех файлов в каталоге, которые не были изменены определенным git коммитом - PullRequest
3 голосов
/ 05 июля 2019

Я знаю, что коммит git изменил несколько файлов в каталоге src/java/task

Он хочет перечислить все файлы в этом каталоге, которые не были изменены как часть этого коммита.

Контекст реального мира: я проверяю изменения, сделанные кем-то, и считаю, что они должны были внести аналогичные изменения в каждый файл в этом каталоге.Я хочу знать любые файлы, которые они не изменили в своем коммите (которые могли быть пропущены или фактически не нуждались в изменении, но я хочу выяснить, почему).

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Если вы можете использовать bash:

comm -23 <(find src/java/task | sort) <(git diff-tree --no-commit-id --name-only -r $COMMIT_HASH | sort)

comm берет два файла и генерирует вывод с тремя столбцами, первый столбец - строки, уникальные для file1, второй столбец - строки, уникальные для file2 и третий столбецстроки, которые появляются в обоих файлах.

В качестве первого файла мы берем список всех файлов в каталоге src / java / task:

find src/java/task | sort

В качестве второго файла - файлы, которыебыли изменены с момента последнего коммита

git diff-tree --no-commit-id --name-only -r $COMMIT_HASH | sort

Нам нужны уникальные файлы в первом файле (файлы не изменены), поэтому нам нужен только первый столбец.Использование -23 в качестве параметра comm будет подавлять столбцы 2 и 3, поэтому мы получаем только первый столбец.

Обратите внимание, что вам нужно отсортировать результаты каждого файла.

Вы можетенужно немного подправить это, но более или менее это способ сделать это.

1 голос
/ 05 июля 2019
#!/bin/bash

commit=$1

# all files under src/java/task/, excluding subfolders
all=$(git ls-tree ${commit}:src/java/task | awk '/ blob /{print "src/java/task/"$4}')

# files changed by the commit
changed=$(git show ${commit} --pretty= --name-only)

# files not changed by the commit
for f in ${all} ${changed} ${changed};do
    echo ${f}
done | sort | uniq -u

Предположим, что сценарий foo.sh, хранилище - /path/to/foo/, а фиксация - HEAD.Чтобы запустить скрипт,

GIT_DIR=/path/to/foo/.git bash foo.sh HEAD

Может быть команда git с некоторыми магическими опциями для выполнения работы, но я пока не могу ее найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...