Как вытащить и вытащить из GitHub без обмена конфиденциальной информацией? Размазать и очистить?

Когда я вытягиваю из github в хранилище сервера, я хочу избежать перезаписи локализованной конфиденциальной информации в определенных файлах, например config.php.

Примечание: это не репо с открытым исходным кодом; У меня есть полный контроль над хранилищем, я единственный пользователь, он частный, но, что очень важно, он основан на среде с открытым исходным кодом, которая может изменить структуру файлов конфигурации. Я просто хочу иметь возможность извлекать из него данные для тестирования, подготовки и производства, и чтобы случайно не запускать конфигурацию производства в ходе испытаний и т. Д. Но я не могу перекодировать файлы конфигурации, чтобы извлекать данные откуда-то еще без тяжелые ситуации слияния позже, если фреймворк будет обновлен.

В идеале я хотел бы иметь возможность сказать Git, что при извлечении во время выборки из REPO_URI всегда отбрасывать любые фрагменты, которые могут изменить информацию, которая в настоящее время находится в строке 24 FILE_PATH. Однако я понимаю, что это невозможно (поправьте меня, если я ошибаюсь).

Однако, если кто-то не может предложить способ сделать это, пожалуйста, прочитайте приведенное ниже решение и дайте мне знать, если это кажется идеальным способом сделать это:

Я бы использовал расширение ключевых слов, как описано в руководстве пользователя git здесь. Ниже я опишу, как я это сделаю, а затем внизу задаю несколько вопросов об этом подходе.

Описание метода

Сначала я бы написал два скрипта, "Sensual_values_inserter" и "Sensual_values_remover", которые заменяют некоторые фиктивные ключевые слова (которые будут в мастере репозитория github) с конкретной конфиденциальной информацией, такой как пароли, имена пользователей, пути к базам данных и т. Д.:

#! /bin/sh -f
sed -e 's/@USERNAME@/dummyvalue/' -e 's/@PASSWORD@/dummyvalue/' $1

и т.п.

Во-вторых, я бы сделал три версии этого скрипта, по одной для каждой среды: тестирование / постановка / производство. Каждая версия будет содержать конкретные пароли, имена пользователей и пути к базе данных, относящиеся к среде, к которой она принадлежит, вместо фиктивных значений. Я бы поместил каждый из этих сценариев в путь относительно каждого из этих репозиториев кода, например так:

/live/filters/sensitive_values_inserter
/live/filters/sensitive_values_remover
/live/repo/{LIVE}
/test/filters/sensitive_values_inserter
/test/filters/sensitive_values_remover
/test/repo/{TEST}
/stag/filters/sensitive_values_inserter
/stag/filters/sensitive_values_remover
/stag/repo/{STAG}

Каждый из этих фильтров будет иметь конкретные значения для соответствующих настроек.

Тогда конфигурация всего репо будет изменена следующим образом:

$ git config filter.infosafe.smudge '../filters/sensitive_values_inserter'
$ git config filter.infosafe.clean '../filters/sensitive_values_remover'

Наконец, в репозитории сервера сделайте это:

$ echo 'config.php filter=infosafe' >> .gitattributes

Таким образом, всякий раз при извлечении из основного сервера, если я правильно понимаю, эти фильтры заменят "фиктивные" значения теми, которые я хочу использовать.

Примечание: чтобы заставить это работать, как указано в этом другом вопросе stackru, после настройки всего, как упомянуто выше, вы должны:

cd /path/to/your/repo
git stash save
git checkout HEAD -- "$(git rev-parse --show-toplevel)"
git stash pop

В промежутке между извлечением и копированием я должен был зафиксировать все изменения в файлах, где выполнялась чистая операция. Не волнуйтесь, после того, как вы их подтвердите, файлы в рабочем каталоге будут испачканы. (Это немного нелогично, но работает.)

Мне удалось успешно нажать на github, и появляются только чистые значения.

(Существует альтернативный, более продвинутый метод в этих направлениях, который включает использование одного.gitignore для ветви и двух драйверов и двух фильтров для ветви. Это позволяет удалять действующие пароли при переключении на тестовую ветвь и наоборот. Хитрость заключается в том, чтобы вызывать очистители для обеих ветвей в.gitignore каждой ветви, но вызывать только smudger ветви, в которой находится.gitignore, поэтому он восстанавливает сам пароль. Тем не менее в этом сценарии при нажатии на GitHub вся конфиденциальная информация остается очищенной, и это хорошо. Я мог бы рассказать об этом, если кому-то будет интересно.)

Вопросы об этом методе и альтернативах

Я проверил это, и это работает. Но...

Есть ли лучший способ сделать это с помощью Git? Я мог бы добавить, что нельзя игнорировать файлы, содержащие конфиденциальную информацию, и нельзя игнорировать изменения при объединении, потому что я хочу иметь возможность извлекать изменения из этих файлов, сохраняя определенные значения конфигурации, Вот почему я не хочу просто использовать git update-index --assume-unchanged FILENAME навсегда игнорировать будущие локальные изменения целых файлов.

Благодарю.

0 ответов

Другие вопросы по тегам