如何将敏感文件推送到Heroku而不是Github上?

时间:2019-03-10 21:02:39

标签: git github heroku

我有一个部署在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提交时出现的,但是如果我通过终端提交,它可以干净地运行而不会产生怪异的行为...不过,最好有一种更安全的方法来完成此操作。

2 个答案:

答案 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钩子。您可以将herokugithub变量编辑为分支的名称(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脚本编写的初学者,从字面上看,这实际上是我两年来编写的第一个脚本!但我希望它对您有用,因为它对我有用!