черный, поскольку хук предварительной фиксации всегда терпит неудачу, мои коммиты

Я пытаюсь использовать pre-commit управлять black как хуки перед фиксацией Git, но я, должно быть, делаю это неправильно.

Черный автоматически применяет правила стиля кода Python. В моем конфигурационном файле перед фиксацией:

-   repo: https://github.com/psf/black
    rev: 19.3b0
    hooks:
    -   id: black

Я ожидаю, что черный цвет просто изменит файл, а фиксация будет успешной.

Но когда я создаю файл (несовместимый с черным) и пытаюсь зафиксировать, черный идет дальше и модифицирует файл, чтобы сделать его совместимым, как задумано... Но проблема в том, что он возвращает "сбой". Итак, фиксация не удалась. И затем я должен отключить файл, затем перезапустить его перед повторной фиксацией... и только тогда фиксация будет успешной.

Это очень раздражает и не может быть запланированным рабочим процессом?

Что я делаю неправильно?

5 ответов

Решение

(автор pre-commit Вот)

фреймворк намеренно не предоставляет возможность автоматической фиксации изменений. Вот несколько вопросов, о которых просили:

Комментарий от одной из этих проблем:

pre-commit никогда не затрагивает область подготовки. Это хорошие способы молча прерывать коммиты. На мой взгляд, это одна из худших вещей, которые [делают и предлагают другие фреймворки] - хуки очень часто не идеальны, и к волшебному изменению того, что совершается, не следует относиться легкомысленно.

Тем не менее, если вы хотите использовать пистолет, ваш крюк может вызвать git add -u и предварительная фиксация не знает ничего лучше:) набросок этого (непроверенный, обескураженный)

  - id: yapf
    entry: bash -c 'yapf "$@"; git add -u' --

(примечание: использование bash потенциально снизит переносимость)

Другой комментарий отмечает

К счастью, git add -u && !! довольно легко бежать, если вы в порядке, стреляя от бедра:)

Один из моих разработчиков дал хороший совет на тот случай, если у вас есть сбой при фиксации из-за черного цвета (например, из-за одинарных / двойных кавычек), который разрешается с помощью хука предварительной фиксации (например, с двойной кавычкой-строкой - фиксатор). вы попадаете в ситуацию "никто не садится на мерзавцев". В поэтапных файлах есть измененный файл, но он не может быть зафиксирован обработчиком pre-commit, git status не увидит никаких изменений, но фиксация не удалась (на мой взгляд, настоящая черная дыра). Вы получаете ошибку только при фиксации, но ничего нельзя сделать (кроме заголовка сброса в этом файле). Как только вы окажетесь в этой ситуации и запустите: используйтеcommit -m 'Resolving pre-commit-hook changes' --no-verify..... тада! Решено.

Глядя на README черного, вы, вероятно, захотите использовать --checkвариант, который просто завершается успешно или безуспешно в зависимости от того, соответствует ли файл стандартам. Это приведет к сбою фиксации без изменения файла.

Я такая же лодка, как ты. Из того, что я исследовал, коммиты не могут быть изменены с помощью хуков перед фиксацией.

Насколько я могу понять, лучше всего то, что изложил bk2204. Мы просим черный цвет предотвратить любые коммиты, которые включают файлы python, которые не были правильно отформатированы черным цветом. Он по-прежнему следит за форматированием любых коммитов, но действительно раздражает, что он не просто автоматически форматирует файлы для нас.

Это имеет смысл. Любые изменения в фиксации должны быть инсценированы. Если бы мы могли сделать это с помощью git-хука, наша проблема была бы решена. Вы прошли половину пути, изменив файл прямо с помощью git-хука. В следующей половине будут производиться все изменения измененных файлов. Но, очевидно... "Вы не можете изменить фиксацию в хуке предварительной фиксации", что означает отсутствие постановки. /questions/10527457/git-hook-izmenit-fajlyi-kommitov/10527467#10527467

Я бы прокомментировал ответ bk2204, но у меня еще нет 50 повторений.

Поцарапайте все это, этот ответ ( /questions/9675022/mozhete-li-vyi-izmenit-soderzhimoe-fajla-vo-vremya-git-commit/9675038#9675038) утверждает, что коммиты могут быть изменены с помощью хука предварительной фиксации. В этом случае файлы добавляются, поэтому я уверен, что в нашем случае файлы можно перегруппировать / изменить.

По моему опыту, нет необходимости unstageлюбые файлы, либо просто git addфайлы, которые затемняются, или другие перехватчики предварительной фиксации, снова измененные, что перезапишет их в области рабочей области и commitс тем же сообщением, что и раньше, если только ошибка не была связана с проверкой сообщения фиксации.

Если ваша фиксация включает в себя все ваши измененные файлы, то просто изменив команду фиксации с git commit -m "Your commit message"к git commit -am "Your commit message"сделает работу красиво.

Другие вопросы по тегам