#git #github #heroku
#git #github #heroku
Вопрос:
У меня есть проект, который развернут на Heroku, и я хотел бы создать общедоступную версию для Github. Проблема в том, что есть папка libs
, которая содержит несколько файлов .js и должна быть отправлена в Heroku, но не на Github. Очевидно, что конфигурация Heroku CLI с помощью не является ответом, поскольку мне нужно скрывать целые файлы, а не только ключи API.
Итак, как я могу отправить полный проект в Heroku, но только частичный проект на Github? В большинстве ответов, которые я нашел, говорилось о командной строке Heroku, которая не может быть применена в моем случае, потому что я пытаюсь скрыть файлы, а не ключи, и другим довольно жестким ответом было сначала нажать, чтобы иметь github
ветку, на которой я бы git cherry-pick
фиксировал данные в ветке heroku. До сих пор я использовал предыдущий ответ, но довольно сложно всегда повторять эту процедуру (по крайней мере, git checkout github
-> git cherry-pick COMMIT-ID
) и отчасти запутывает историю.
Итак, я попытался создать перехват после фиксации, чтобы каждый раз, когда я совершал фиксацию на master (heroku), он переключался на ветку github, выбирал фиксацию, а затем возвращался к master, чтобы процедура выглядела плавно. К сожалению, это работает только иногда, но больше всего приводит к сбоям git.
branch=`git branch | grep * | cut -d ' ' -f2`
if [ "$branch" = "master" ]
then
echo "Executing post-commit script (cherry-pick)..."
commitID=`git rev-parse HEAD`
git checkout Github
git cherry-pick $commitID
git checkout master
echo "Cherry picked $commitID into Github branch"
fi
Редактировать:
Похоже, что теперь перехват после фиксации работает большую часть времени. Я думаю, что проблемы возникают, когда я совершаю через VSCode, но если я совершаю через терминал, он выполняется чисто, без странного поведения… Тем не менее, было бы неплохо иметь, возможно, более безопасный способ сделать это.
Комментарии:
1. После прочтения немного больше, почему вы выбираете вишню вместо объединения?
2. При слиянии будут применены коммиты на master (который содержит коммит, в который были добавлены конфиденциальные файлы). При выборе вишни будут применены только изменения, внесенные в выбранный коммит. Итак, что я сделал, это сначала сделал коммит на master, у которого есть конфиденциальные файлы, без слияния или выделения этого коммита в ветке github. Затем следующий коммит на master, содержащий общедоступные изменения, может быть перенесен в github, оставив конфиденциальные файлы без объединения. Поскольку приведенный выше скрипт запускается для каждого коммита, его следует отключить перед выполнением другого коммита с конфиденциальными файлами в master.
Ответ №1:
Работайте над master
и объединяйте master
с heroku
, когда вам нужно нажать. Когда вам нужно что-то изменить, специфичное для Heroku, переключитесь на heroku
и зафиксируйте там. Я не могу придумать лучшего решения.
* 8a5767e (HEAD -> heroku) Merge branch 'master' into heroku
|
| * 12fcd68 (master) Change public.js
* | 54db1a6 Add secret files (e.g. `/libs`)
|/
* 8aa2e42 Init
Комментарии:
1. Да, использование определенных ветвей для определенных пультов имеет смысл. Просто убедитесь, что вы никогда случайно не отправите
heroku
ветку на github.2. Я думал об этом, но тогда у меня не было бы доступа к моим секретным файлам (/ libs) на master, поскольку они должны существовать только в ветке heroku…
3. Что, если добавить конфиденциальные файлы в
.gitignore
файл только в ветке github? Когда вы меняете ветки, они не изменяются, вы объединяете все изменения, которые происходят вgithub
вheroku
, затем вносите любые изменения, которые вам нужны, только в конфиденциальных файлах вheroku
ветке. Похоже, это сработает.4. @Major на самом деле они удаляются при оформлении заказа
github
. Но, возможно, есть способ обойти это.5. @WofWca если есть способ обойти это, то ваш ответ может сработать, я просто не смог найти обходной путь…
Ответ №2:
Поскольку на этот пост не было получено ответа, который соответствовал бы моим потребностям, я с тех пор сохранил свое решение для выбора вишни с помощью git hook. С тех пор я улучшил его, и до сих пор он работает просто отлично. Вот мой post-commit
хук. Вы можете отредактировать переменную heroku
and github
в соответствии с названием ваших ветвей ( heroku
это частная ветвь, github
это общедоступная). При фиксации в heroku
ветке, в моем случае master
, перехват переключится на github
ветку и выделит в ней фиксацию, затем переключится обратно на master. Все это происходит так быстро, что вы даже не замечаете переключения! Все, что вам нужно сделать, это отправить свою работу, когда вы будете готовы!
#!/bin/sh
# After each commit on master (Heroku), it will switch to the Github branch and cherry-pick that commit into it. Then, switch back to master.
# This makes the committing flow seamless so all you have to do is push (which is safer done manually than with a hook)
# IMPORTANT: ANY changes in sensitive files should be commited alone (without public changes) or the sensitive files will be cherry picked in the public branch
# To skip this cherry-picking procedure (when you add a sensitive commit), start the commit message with "NCP" e.g.: "NCP Add some secret stuff"
ERR='e[31m'
SUCCESS='e[32m'
WARN='e[33m'
space="nnn"
branch=`git branch | grep * | cut -d ' ' -f2`
heroku="master"
github="Github"
if [ "$branch" = $heroku ]
then
echo -e $space
message=`git log -1 --pretty=%B`
if [[ $message = NCP* ]]; then
echo -e "${WARN}NOT cherry-picking (commit message starts with 'NCP')"
echo -e $space
exit 0;
fi
echo -e "${WARN}Executing post-commit script (cherry-pick)..."
commitID=`git rev-parse HEAD`
if git checkout $github; then
if git cherry-pick $commitID; then
echo -e "${SUCCESS}Cherry picked $commitID into $github branch"
if ! git checkout $heroku; then
echo -e "${ERR}Couldn't checout to $heroku"
echo -e $space
exit 1
fi
else
echo -e "${ERR}Failed to cherry pick $commitID into $github branch. Do it manually"
echo -e $space
exit 1
fi
else
echo -e "${ERR}Couldn't checkout to $github"
echo -e $space
exit 1
fi
echo -e $space
fi
exit 0
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я абсолютный новичок в написании сценариев bash, это буквально первый скрипт, который я написал за 2 года! Но я надеюсь, что этого достаточно для ваших нужд, так как это работает для меня!