Git hook, чтобы обнаружить push --mirror - PullRequest
2 голосов
/ 09 февраля 2012

рядом с основным Git-репозиторием на сервере (с Gitolite) Я бы хотел, чтобы у каждого разработчика была возможность создать зеркало для своего локального репозитория Это не сложно.

Тем не менее, я хочу отключить git push --mirror в главном репозитории Git-сервера, чтобы предотвратить ошибки, если разработчик отвергает зеркалирование. Я думаю, что лучшее место - это хук, может быть, хук обновления. Но я не могу найти, как обнаружить в ловушке сервера, что команда push --mirror была выполнена на клиентском компьютере.

Решение на стороне клиента невозможно, поскольку мы также используем Eclipse Git (JGit).

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Если вы действительно хотите сделать это с помощью хуков, то хук будет использовать 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
  • более полно, так что если кто-то нанесет ущерб, вы сможете точно определить, кто это были что они сделали, и избежать этого в будущем
2 голосов
/ 09 февраля 2012

Я бы не пытался «залатать» безопасность с помощью хуков. Они не были предназначены для этого типа контроля доступа.

Вы можете посмотреть на гитолит. Это позволяет вам контролировать доступ на предварительной ветке.

См. https://github.com/sitaramc/gitolite/wiki

...