Проверьте, изменился ли один файл, а другой не использовал grep для предварительной фиксации Git

#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 имена файлов и, чтобы использовать этот метод.)