Как мне отправить конфиденциальные файлы в Heroku, но не на Github?

#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 года! Но я надеюсь, что этого достаточно для ваших нужд, так как это работает для меня!