Ето как работи подходът на куката 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