Вот как работает подход pre-push
ловушка с веткой с именем dontpushthis
.
Создать этот файл как .git/hooks/pre-push
:
if [[ `grep 'dontpushthis'` ]]; then
echo "You really don't want to push this branch. Aborting."
exit 1
fi
Это работает, потому что списоквыдаваемые ссылки передаются на стандартный ввод.Так что это также поймает git push --all
.
Сделайте его исполняемым.
Сделайте это в каждом локальном хранилище.
Когда вы попытаетесь перейти в эту ветку, высм .:
$ git checkout dontpushthis
$ git push
You really don't want to push this branch. Aborting.
error: failed to push some refs to 'https://github.com/stevage/test.git'
Очевидно, что это так просто, как кажется, и только предотвращает нажатие на ветку с именем "dontpushthis".Поэтому полезно, если вы пытаетесь избежать прямого перехода к важной ветке, такой как master
.
. Если вы пытаетесь решить проблему предотвращения утечки конфиденциальной информации, этого может быть недостаточно.Например, если вы создали дочернюю ветку из dontpushthis
, эта ветвь не будет обнаружена.Вам понадобится более сложное обнаружение - вы можете посмотреть, присутствуют ли какие-либо коммиты в ветви «dontpushthis», например, в текущей ветви.
Более безопасное решение
Lookingна вопрос снова, я думаю, что лучшее решение в этом случае было бы:
- Иметь одно репо, которое является публичным
- Клонировать это в новый рабочий каталог, который является приватным
- Удаление удаленного (
git remote rm origin
) из этого рабочего каталога. - Чтобы объединить публичные изменения, просто выполните
git pull https://github.com/myproj/mypublicrepo
Таким образом, рабочий каталог частного репо никогда не будетесть где угодноПо сути, у вас есть односторонний канал передачи публичной информации в частную, но не обратно.