Есть ли способ загрузить файлы, игнорируемые gitignore, только в определенное хранилище? - PullRequest
0 голосов
/ 21 декабря 2018

Мы настраиваем проект в Rails, и фактом является то, что у нас есть два репозитория git для этой цели, одно - bitbucket (мы отслеживали проект), а другое - Heroku (Production).Мы должны загрузить файл учетных данных в Heroku, чтобы приложение могло работать должным образом, но мы не хотим, чтобы этот файл загружался в Bitbucket из-за проблем безопасности, поэтому наш вопрос: можем ли мы установить какую-то опцию в файл gitignore для загрузки учетных данныхфайл просто для Heroku и нет для Bitbucket?Заранее спасибо.

Мы пытались загрузить файл через Transfer.sh и gpg, но мы не будем его использовать, так как этот файл очень деликатный с точки зрения безопасности.Также создание файла с использованием heroku bash невозможно, поскольку Heroku автоматически удаляет его.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы можете сделать это, но, может быть, не совсем так, как вы описали.

Когда git толкает (или тянет), он общается в терминах "ссылок" и их истории.История ссылки состоит из коммитов.В этом контексте коммит является неизменным и может рассматриваться как атомарный - вы либо отправляете коммит, либо нет.В коммите есть структура каталогов и файлов (примерно), которые составляют снимок содержимого проекта.

Таким образом, чтобы включить файл при отправке в heroku, но не при отправке в bitbucket,Вам необходимо отправить различных коммитов каждому репо.Что на практике означает, что вы должны отправлять разные ссылки.И это нормально - вы можете иметь файл в «производственной ветке», а не в других ветках.Вы можете опустить производственную ветку от ваших пушей до битбакета и включить ее в свои пушы к героку.

Теоретически это так просто.Вы запускаете репо без конфиденциального файла.Вы наносите на карту пульты - скажем, origin сопоставляет с bitbucket, а heroku сопоставляет с вашим репозиторием prod heroku.

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

O -- ...  -- A <--(master)(origin/master)

(Здесь O - это ваш начальный коммит; ... представляет любой вид истории вообще - возможно, с ветвлениями и слияниями и т. Д .; и A - это коммит, который вы хотите опубликоватьЯ показал, что он находится на ветке master, что согласуется с такими моделями, как GitFlow, но в этом нет особой необходимости.)

Итак, вы проверяете эту версию, а затем

git checkout -b production
# create/copy the sensitive file into your work tree
git add path/to/sensitive file
git commit -m "production release 1"

Теперь у вас есть

O -- ...  -- A <--(master)(origin/master)
              \
               P1 <--(production)

Вы не хотите помещать production в битбакет, но вы do хотите отправить его в Heroku.Обратите внимание, что ваша производственная ветка в репозитории heroku должна называться master, поэтому вы можете сказать что-то вроде

git push heroku production:master

и у вас будет

O -- ...  -- A <--(master)(origin/master)
              \
               P1 <--(production)(heroku/master)

Затем в ваши местные филиалы приходит больше коммитов, и в конце концов вы хотите опубликовать снова.

O -- ...  -- A -- ... -- B <--(master)(origin/master)
              \
               P1 <--(production)(heroku/master)

В этом сценарии вы можете просто

git checkout production
git merge master 

База слияния будет A.Единственное изменение с A на production - добавление конфиденциального файла, а master не имеет конфиденциального файла (поэтому не может быть внесен в него конфликтующие изменения);поэтому слияние должно пройти гладко, и вы получите

O -- ...  -- A -- ... -- B <--(master)(origin/master)
              \           \
               P1 --------- P2 <--(production)
                ^(heroku/master)

Итак, вы снова толкаете к героку

git push heroku production:master

, заканчивающемуся на

O -- ...  -- A -- ... -- B <--(master)(origin/master)
              \           \
               P1 --------- P2 <--(production)(heroku/master)

Чтобы сохранить слияния вproduction ветвь простая, каждый раз, когда вы выпускаете новую версию (например, B), вы хотите, чтобы предыдущая версия (например, A) была "достижимой" с B.Большинство моделей ветвления даст вам это.Но по какой-то причине вы могли бы сделать что-то вроде

                     x -- x -- C <--(special-release)
                    /
O -- ...  -- A -- ... -- B <--(master)(origin/master)
              \           \
               P1 --------- P2 <--(production)(heroku/master)

В этом случае простое слияние не сработало бы для обновления production, так что оно "выглядит" C.Если вы чувствуете, что вам абсолютно необходимо поддержать это дело, я могу добавить некоторые соображения о том, как это сделать, но лучший совет - это продолжать выпускать историю, движущуюся в одном направлении (что, опять же, часто является тем, что ваша * 1068В любом случае * ветка будет делать для вас).

Вы можете видеть, что есть много места для человеческой ошибки, если вы просто сделаете именно то, что я описал выше.В качестве отказоустойчивого устройства вы можете создать только один специальный локальный репозиторий, в котором вы создаете производственную ветку.(Если ваши другие локальные репозитории не содержат production, вы не можете случайно отправить production из них в bitbucket.) Вы также можете изменить конфигурацию этого специального репо, чтобы при отправке по умолчанию локальный * 1073 отправлялся* Герою master.(См. Документацию по git config для получения дополнительной информации об опциях для этого.)

0 голосов
/ 21 декабря 2018

Можем ли мы установить какую-то опцию в файл gitignore для загрузки файла учетных данных ТОЛЬКО В Heroku И НЕТ в bitbucket?

Нет.Есть несколько вещей, которые вы могли бы сделать, хотя хранение учетных данных в репозитории, как правило, неправильная идея.

Git - это не файлы .Git составляет около коммитов .Коммиты содержат файлы, поэтому, получая и используя коммит, вы можете получить эти файлы, но основной единицей Git является коммит.

Между тем, .gitignore это о файлах - в частности, о файлах в вашем рабочем дереве, которые не будут в будущих коммитах.Здесь встречается камень преткновения, потому что вы создаете new коммит в том, что Git называет index .Однако, в конце концов, если запись игнорирования эффективна, то это потому, что она не позволяет файлу войти в следующий коммит. Механизм здесь - файл .gitignore - совершенно не имеет значения.

  • Если вы не позволите файлу перейти в следующий коммит,который в конечном итоге переходит к Bitbucket, затем, если и когда тот же коммит также отправляется в Heroku, этот коммит также не будет иметь этот файл.

  • Аналогично, если и когда вы помещаете файл в коммит, который в конечном итоге попадает в вашу систему Heroku, тогда, если и когда тот же коммит также отправляетсядля Bitbucket этот коммит будет по-прежнему иметь файл.

Это проясняет ситуацию: Если у коммита есть файл, тот, у кого есть коммит, имеет файл. Можно отправлять коммиты в Heroku, которые вы никогда не отправляете в Bitbucket, но, поскольку Git в целом разработан на основе философии, в которой он имеет тенденцию отправлять каждый коммит каждому , подумайтео как вы намереваетесь убедиться, что данные безопасностиПеред тем, как вы попытаетесь это сделать.

Если вы все равно не решаетесь на это, обратите внимание, что .gitignore, вероятно, будет неправильным механизмом для иногда помещения файлов, а иногда и для сохранения файлов внеКонкретные коммиты.(Это потому, что запись .gitignore вступает в силу , только если файл еще не находится в индексе , и, проверяя любой коммит, который имеет файл, помещает файл в индекс, так что файл next также будет иметь файл, независимо от какой-либо записи .gitignore.

...