Вот как работает подход ловушки 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» в текущей ветке.
Более безопасное решение
Еще раз взглянув на вопрос, я думаю, что лучшим решением в этом случае будет:
- Иметь одно публичное репо
- Клонируйте это в новый рабочий каталог, который является частным
- Удалите пульт (
git remote rm origin
) из этого рабочего каталога.
- Чтобы объединить общедоступные изменения, просто выполните
git pull https://github.com/myproj/mypublicrepo
Таким образом, в рабочем каталоге частного репо никогда не будет места, куда он мог бы нажать. По сути, у вас есть односторонний клапан из публичной информации в частную, но не обратно.
person
Steve Bennett
schedule
27.05.2015