#bash #git #grep
#bash #git #grep
Вопрос:
Я хочу проверить, был ли изменен мой schema.graphqls при фиксации, если он был и мой сгенерирован.go не изменился, я хочу отклонить фиксацию. В настоящее время мой хук предварительной фиксации представляет собой следующий сценарий:
#!/bin/bash
GENERATED_FILE="graphql/generated/generated.go"
SCHEMA_FILE="graphql/schema.graphqls"
git diff --cached --name-only | if grep -E "$SCHEMA_FILE" | grep -E invert "$GENERATED_FILE"
then
echo "Schema file has changed and generated code needs updating."
exit 1
fi
В настоящее время это позволяет мне фиксировать, даже если изменился только schema.graphqls, а не мой сгенерированный.go. Я не уверен, что это то, и я пытаюсь использовать grep.
Комментарии:
1. Это разумный (или, по крайней мере, не совсем разумный) подход, но если ваш файл go сгенерирован из вашего файла схемы, я бы посоветовал вообще не фиксировать файл go.
Ответ №1:
git diff --quiet <file>
возвращает 1
, если <file>
изменилось, а 0
если нет, что позволяет выполнить следующие действия:
#!/bin/bash
GENERATED_FILE="graphql/generated/generated.go"
SCHEMA_FILE="graphql/schema.graphqls"
if ! git diff-index --cached HEAD --quiet "${SCHEMA_FILE}" amp;amp;
git diff-index --cached HEAD --quiet "${GENERATED_FILE}"
then
echo "Schema file has changed and generated code needs updating."
exit 1
fi
(Помните, что 0
это true
и все остальное false
в Bash.)
Редактировать: включены исправления torek.
Комментарии:
1. Похоже, это не распознает, когда файл не изменился.
2. Это близко, но вы хотите использовать
git diff --cached
, чтобы сравнить индексную копию файла сHEAD
копией фиксации файла. Или, возможно, лучше,git diff-index --cached HEAD
. (Сохраните--quiet
имена файлов и, чтобы использовать этот метод.)