Если вы действительно хотите сделать это с помощью хуков, то хук будет использовать pre-receive
.Вы не можете непосредственно обнаружить, что это зеркальный толчок, потому что в отправляемых данных нет ничего, что говорит о том, что это так, но вы могли бы быть умным и сделать это правильно почти все время.Хук предварительного получения получает список ссылок для обновления со старыми и новыми значениями, и если он выходит с ненулевым статусом, весь запрос прерывается.Вероятно, главная отличительная особенность зеркального толчка заключается в том, что он также толкает удаленные ветви как есть.Я не могу вспомнить ни одного нормального случая, в котором вы бы это делали, так что вы можете просто проверить это, что-то вроде:
#!/bin/bash
while read old new ref; do
if [[ "$ref" =~ "^refs/remotes/.*" ]]; then
echo "You're pushing remote branches - did you use 'push --mirror'?"
echo "Rejecting push"
exit 1
fi
done
Любой push --mirror
* отключит этот хук, поэтому он должен охватыватьвы;это, конечно, немного переусердствовало, но если вы не собираетесь поддерживать удаленные ветви в вашем центральном репо, это не будет иметь значения.
* За исключением действительно очень ручного, когда кто-то выталкивает из репо снет пультов, указав git push --mirror <url>
вручную, но я действительно надеюсь, что вам не нужно об этом беспокоиться.
Я бы по-прежнему рекомендовал gitolite .Он не позволяет вам отрицать зеркальные толчки, но может несколько помочь и предоставить много других полезных вещей.Обратите внимание, что Gitolite действительно позволяет вам добавлять свои собственные крючки, поэтому желание использовать это не должно помешать вам получить все эти качества Gitolite.Если вы не собираетесь использовать Gitolite, вам действительно следует установить core.logAllRefUpdates
в значение true в центральном репо, чтобы, если кто-то действительно получил от вас плохой толчок, вы могли восстановиться.
Вещи, связанные ск этой проблеме, которую gitolite сделает для вас:
- позволит вам ограничить большинство разработчиков только в доступе к ключевым ветвям и запретить им что-либо удалять (используйте разрешения
RW
, а не RW+
), поэтому ущерб, который они могут нанести, ограничен - удаление ветвей, вероятно, является наихудшей частью доступа к журналу push --mirror
- более полно, так что если кто-то нанесет ущерб, вы сможете точно определить, кто это были что они сделали, и избежать этого в будущем