Когда я запускаю git remote -v
один из своих репозиториев Git, в котором настроен пульт (ы), я вижу, что каждый пульт имеет спецификации как для извлечения, так и для push:
$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)
Для пультов, которые указывают на равноправных разработчиков, нет необходимости нажимать, и Git в любом случае откажется отправлять в репозиторий, отличный от чистого. Есть ли способ настроить эти пульты как «только для выборки» без push-адреса или возможностей?
Ответы:
Я не думаю, что вы можете удалить URL-адрес push, вы можете только переопределить его, чтобы он отличался от URL-адреса для извлечения. Поэтому я думаю, что самое близкое, что вы получите, будет примерно таким:
Вы устанавливаете URL-адрес push
no-pushing
, который, если в вашем рабочем каталоге нет папки с таким же именем, git не сможет ее найти. По сути, вы заставляете git использовать несуществующее местоположение.источник
git remote set-url --push origin -- --read-only--
- обратите внимание на дополнительную--
информацию, позволяющую имя с дефисами в начале. Мне это показалось более читаемым.Помимо изменения URL-адреса push на что-то недопустимое (например,
git remote set-url --push origin DISABLED
), можно также использоватьpre-push
ловушку.Один из быстрых способов остановиться
git push
- сделать символическую ссылку/usr/bin/false
крючком:Использование крючка позволяет при желании более точно контролировать толчки. См.
.git/hooks/pre-push.sample
Пример того, как предотвратить продвижение незавершенных коммитов.Чтобы предотвратить отправку в конкретную ветку или ограничить отправку в одну ветку, это в примере ловушки:
Тестовое репо с несколькими пультами:
Нажатие на
origin
разрешено:Отправка на любой другой пульт не разрешена:
Обратите внимание, что
pre-push
скрипт перехвата может быть изменен, среди прочего, для вывода сообщения на stderr о том, что push отключен.источник
Общее утверждение «Git откажется отправлять данные в репозиторий, отличное от чистого», неверно. Git откажется от отправки в удаленный репозиторий, отличный от чистого, если вы попытаетесь отправить изменения, которые находятся в той же ветке, что и рабочий каталог удаленного репозитория.
Этот ответ дает простое объяснение: https://stackoverflow.com/a/2933656/1866402
(Я добавляю это как ответ, потому что у меня еще недостаточно репутации, чтобы добавлять комментарии)
источник
Если у вас уже есть удаленная настройка и вы просто хотите защитить себя от чего-то вроде случайного нажатия напрямую на
master
илиrelease/production
, вы можете предотвратить это использованиеgit config
.Для справки,
no_push
это не особое имя. Это просто название несуществующей ветки. Итак, вы могли использовать$ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_master
и он будет работать нормально.Дополнительная информация: git-config pushRemote
источник
Если у вас есть контроль над репозиторием, вы можете добиться этого, используя разрешения. Пользователь, получающий репозиторий, не должен иметь прав на запись в главный репозиторий.
источник