В качестве своего рода общего правила крючки не могут изменять сами себя. Есть конкретные случаи, которые явно разрешены, а некоторые из них работают случайно, но после того, как действительно существует это не может быть изменено. A git filter-branch
или git commit --amend
фактически не изменяет фиксацию; вместо этого он добавляет новый фиксация, которая напоминает оригинал, но имеет какое бы то ни было изменение, которое у вас было. Этот новый фиксатор имеет новый, другой идентификатор хеширования.
Удивительно, что это не сработало с ssh, но это удалось с помощью https. Это просто удача, и можно утверждать, что это bad удачи, что это работал. Подталкивающий крючок предназначен только для того, чтобы сказать «да, этот толчок разрешен» или «нет, этот толчок запрещен». Он не должен изменять сопоставление имени-фиксации-идентификатора. Очевидно, что на самом деле происходит то, что push на основе http заканчивается повторением имени для сопоставления идентификатора и получения нового идентификатора, тогда как основанные на ssh кнопки имеют идентификатор, который он получил изначально.
Теперь вы можете сделать всю эту работу:
- В предварительно толкающего крючок, проверьте, разрешено ли толчок.
- Если да, то передайте его.
- Если нет, подготовьтесь к его отклонению.Сделайте новую фиксацию, которая будет разрешена и, возможно, будет нажата на нее (рекурсивно, с внутренним
git push
, работающим во время внешнего git push
- рекурсия будет завершена, так как будет допущено только что сделанное совершение, только что сделанное, должно быть разрешено, так что эта ветвь логики не будет работать во время внутреннего нажатия). Затем распечатайте сообщение об ошибке, отметив, что (и почему) исходный push был отклонен и было ли выполнено «внутреннее» нажатие, и если да, то ли это удалось, а если нет, то, что его идентификатор и как пользователь может его использовать. Наконец, отклоните push.
Есть несколько причин, чтобы избежать этого рекурсивного метода: (а) нарушает ожидания любого опытного пользователя Гит, который не будет ожидать, что его собственные обязательства по замене и толкания; и (б) если это пойдет не так - если рекурсия не прекращается немедленно, например, может быть очень неправильно. Часть (b) может быть уменьшена с помощью умения в предтолкательном крюке (например, экспортировать переменную окружения в внутренний push, отмечая, что рекурсия происходит, и если она собирается перезаписываться, шумно возникает, если эта переменная установлена). Часть (а), пожалуй, простительна, учитывая, что вначале должен быть установлен пользовательский ключ, который должен быть установлен пользователем.
Даже если вы справляетесь с этими возражениями, есть еще одна причина избежать этого: он приводит к сбою внешнего (нерекурсивного) нажатия. Пользователь увидит, что нажатие не удалось, даже если внутренний толчок преуспел. Это будет, по крайней мере, немного запутанным.