我有一个部署在Heroku上的项目,我想为Github制作一个公共版本。问题在于,存在一个文件夹libs
,其中包含多个.js文件,应将其推送到Heroku,但不能推送到Github。显然,Heroku CLI配置不是解决方案,因为我要隐藏整个文件,而不仅仅是API密钥。
那么,我如何将整个项目推到Heroku,而将部分项目推到Github?我发现的大多数答案都是关于Heroku CLI的,该问题在我的情况下不适用,因为我试图隐藏文件,而不是密钥,而另一个非常顽固的answer是首先推动拥有一个github
git cherry-pick
在heroku分支上提交的分支。到目前为止,我一直在使用上一个答案,但是很难总是重复执行此过程(至少git checkout github
-> git cherry-pick COMMIT-ID
),并且弄乱了历史。
因此,我尝试制作一个提交后的钩子,以便每次我对master(heroku)进行提交时,它将切换到github分支,cherry-pick提交然后回到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提交时出现的,但是如果我通过终端提交,它可以干净地运行而不会产生怪异的行为...不过,最好有一种更安全的方法来完成此操作。
答案 0 :(得分: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 :(得分:0)
由于此帖子没有得到适合我需求的答案,因此从那时起,我就使用git hook保留了我挑剔的解决方案。从那以后,我对其进行了改进,到目前为止,它一直运行良好。这是我的post-commit
钩子。您可以将heroku
和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="\n\n\n"
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脚本编写的初学者,从字面上看,这实际上是我两年来编写的第一个脚本!但我希望它对您有用,因为它对我有用!