2017-02-16 95 views
0

фона: ОС: Windows Git версии: 2.11.0мерзавец толкает неправильно совершать SHA при работе через SSH

Согласно нашей политике, мы: 1. Добавление нескольких поле для коммитах сообщений unpushed фиксаций перед нажатием 2. Проверка на удаленном компьютере, в котором нажатие сообщения фиксации содержит обязательные поля

Мы редактируем сообщение фиксации через «git - фильтр-ветвь -msg-filter», который запускается во время предварительного нажатия.

При попытке нажать через SSH, git нажимает фиксацию SHA до ее повторной записи. , например:

  1. Unpushed совершают ША является: 38dad1575a3c4239c967564c21347aad3d5b2a55
  2. Run GIT нажимные
  3. Pre-нажимные пробегов и переписывает фиксации.
  4. Теперь моя фиксация SHA: 8115fdfb3be86a6b51284cd1d278bd55017990ce.
    Предыдущих фиксации 38dad1575a3c4239c967564c21347aad3d5b2a55 теперь хранятся под/ссылками/оригинал/рефов
  5. Нажми не в репо с момента совершения 38dad1575a3c4239c967564c21347aad3d5b2a55 (неотредактированная фиксация) не содержит необходимые поля в его фиксации сообщении.

Такое поведение наблюдается только при работе с SSH. Для пользователей, работающих с HTTPS, все работает нормально.

Любая помощь будет оценена по достоинству.

Спасибо!

ответ

1

В качестве своего рода общего правила крючки не могут изменять сами себя. Есть конкретные случаи, которые явно разрешены, а некоторые из них работают случайно, но после того, как действительно существует это не может быть изменено. A git filter-branch или git commit --amend фактически не изменяет фиксацию; вместо этого он добавляет новый фиксация, которая напоминает оригинал, но имеет какое бы то ни было изменение, которое у вас было. Этот новый фиксатор имеет новый, другой идентификатор хеширования.

Удивительно, что это не сработало с ssh, но это удалось с помощью https. Это просто удача, и можно утверждать, что это bad удачи, что это работал. Подталкивающий крючок предназначен только для того, чтобы сказать «да, этот толчок разрешен» или «нет, этот толчок запрещен». Он не должен изменять сопоставление имени-фиксации-идентификатора. Очевидно, что на самом деле происходит то, что push на основе http заканчивается повторением имени для сопоставления идентификатора и получения нового идентификатора, тогда как основанные на ssh кнопки имеют идентификатор, который он получил изначально.

Теперь вы можете сделать всю эту работу:

  • В предварительно толкающего крючок, проверьте, разрешено ли толчок.
    • Если да, то передайте его.
    • Если нет, подготовьтесь к его отклонению.Сделайте новую фиксацию, которая будет разрешена и, возможно, будет нажата на нее (рекурсивно, с внутренним git push, работающим во время внешнего git push - рекурсия будет завершена, так как будет допущено только что сделанное совершение, только что сделанное, должно быть разрешено, так что эта ветвь логики не будет работать во время внутреннего нажатия). Затем распечатайте сообщение об ошибке, отметив, что (и почему) исходный push был отклонен и было ли выполнено «внутреннее» нажатие, и если да, то ли это удалось, а если нет, то, что его идентификатор и как пользователь может его использовать. Наконец, отклоните push.

Есть несколько причин, чтобы избежать этого рекурсивного метода: (а) нарушает ожидания любого опытного пользователя Гит, который не будет ожидать, что его собственные обязательства по замене и толкания; и (б) если это пойдет не так - если рекурсия не прекращается немедленно, например, может быть очень неправильно. Часть (b) может быть уменьшена с помощью умения в предтолкательном крюке (например, экспортировать переменную окружения в внутренний push, отмечая, что рекурсия происходит, и если она собирается перезаписываться, шумно возникает, если эта переменная установлена). Часть (а), пожалуй, простительна, учитывая, что вначале должен быть установлен пользовательский ключ, который должен быть установлен пользователем.

Даже если вы справляетесь с этими возражениями, есть еще одна причина избежать этого: он приводит к сбою внешнего (нерекурсивного) нажатия. Пользователь увидит, что нажатие не удалось, даже если внутренний толчок преуспел. Это будет, по крайней мере, немного запутанным.