Есть ли какой-нибудь способ запретить commintng package-lock.json, если package.json не изменился? - PullRequest
0 голосов
/ 01 марта 2019

В эти дни у меня возникает проблема с непреднамеренным нажатием package-lock.json.

Ex)

Я запускаю npm install в своей ветви функций, и мой package-lock.json обновляется.

Я сделал коммит и моя функциональная ветвь объединена с веткой разработки.Package-lock.json в ветвь разработки перезаписывается на package-lock.json в моей ветви функций .

Из-за обновленных пакетов в package-lock.json приложение сломалось.


Я знаю, что должен быть осторожен, чтобы не нажимать package-lock.json, если package.json не изменился, но иногда я забываю.

Поэтому я думаю, смогу ли я добавитькакое-то правило в pre-commit показывает некоторые предупреждения, если я фиксирую только package-lock.json.Есть ли способ сделать это?

спасибо

1 Ответ

0 голосов
/ 11 марта 2019

Если вы уже используете Git Hooks, такие как «pre-commit», вы можете добавить еще один скрипт в список «pre-commit» и написать скрипт, который делает то, что вам нужно (код ниже).

Используя комбинацию команд git / grep, вы можете проверить, что в списке промежуточных файлов «package.json» и «package-lock.json» есть (или ни одна из них не существует).

Сценарий может быть:

#!/bin/sh
if [ `git diff --name-only --cached | egrep -c 'package.json|package.lock.json'` == "0" -o `git diff --name-only --cached | egrep -c 'package.json|package.lock.json'` == "2" ]; then
  echo "Checked successfully."
elif [ `git diff --name-only --cached | egrep -c 'package.json'` == "1" -a `git diff --name-only --cached | egrep -c 'package.lock.json'` == "0" ]; then
  echo "Warning: you are committing package.json without package.lock.json"
else
  echo "Error: make sure you commit BOTH package.json and package.lock.json"
  exit 1
fi
exit 0

git diff --name-only --cached получает список промежуточных файлов (только имена файлов)

| использовать результат предыдущей команды в качестве аргументадля следующего

egrep для поиска (в этом случае ищите строки 'package.json' и 'package.lock.json')

-c подсчитывает количествоmatch

Завершение всей команды в кавычки выполнит ее и предоставит результат в основной скрипт

Результат команды git + egrep возвращает количество найденных вхождений.Затем вы проверяете, что это за результат, чтобы скрипт продолжал (exit 0) или выходил (exit 1).

Сделайте исполняемый файл скрипта и добавьте ссылку на него в свой package.json:

"scripts": {
  "check-package": "./bin/check-package.sh",
}
...
"pre-commit": [
  "check-package"
]

Так и должно быть!

Когда вы закончите, убедитесь, что вы сначала зафиксировали только сценарий, а затем package.json (иначе он уже будет искать сценарий)., не находя его).

Последнее примечание: этот подход действителен для проверки любых 2 или более файлов, которые должны быть одновременно в списке файлов, подготовленных для фиксации.

...