Я не GIT эксперт и простите, если это неправильный форум для этого, но я использую GIT для развертывания кода на моем производственном сервере, который работает нормально, я просто делаю git push production master
где production
указывает на мой сервер WPEngine, и он, очевидно, будет копией главной ветви.
Проблема этого подхода заключается в том, что нам нужно включить все, что нужно для работы prod в репо. Сюда входят такие вещи, как dist/
(сгенерированный CSS / JS et c), а также vendor/
(composer установленные сторонние библиотеки), что явно не идеально.
Для борьбы с этим я было (на мой взгляд) простая идея отдельных .gitignore
с. Один для origin
и один для production
. Я настроил это так: у меня обычный .gitignore
, а затем у меня есть .prodignore
.
Затем я написал простой сценарий оболочки (deploy.sh
), который выполняет следующее:
Go через каждый .prodignore
файл и переименуйте его .gitignore
:
for prodignore in $(find . -name '.prodignore'); do
gitignore=$(echo $prodignore | sed 's/prodignore/gitignore/')
mv $prodignore $gitignore
done
Удалите все файлы из GIT, но сохраните их на диске: git rm -r --cached --quiet .
(это касается удаления файлов, которые теперь находятся в новом .gitignore
- как src/
)
Теперь заново добавьте все файлы с новым .gitignore
: git add --all
(это касается добавления файлов, которые ранее были в .gitignore
- например, dist/
)
Commit и pu sh в production
remote: git commit --quiet -m 'Sleek Deploy' && git push --quiet --force production master
Наконец go назад один коммит, поэтому мы отменяем все, что мы только что сделали: git reset HEAD~ && git reset --hard HEAD
Это все работает в основном тоже хорошо. Правильные новые файлы помещаются в production
, и мой локальный репозиторий, а также origin
по-прежнему выглядят хорошо и, насколько я могу судить, не имеют странной истории.
Что означает , а не Однако, работа, которую я только недавно заметил, заключается в том, что если я удаляю файл со своего локального компьютера, pu sh удаляет до origin
, а затем развертывает до production
, используя описанные выше шаги, удаленный файл не будет удален.
Почему это? Могу ли я что-нибудь сделать, чтобы он был удален? Весь мой подход к этому несовершенен? Imo, имеющий отдельные .gitignore
файлы для отдельных пультов, является таким простым решением этой проблемы, но, возможно, я откусил больше, чем могу прожевать.
Стоит отметить, что если я не --force
pu sh на шаге 4 пульт сообщает, что мы не в курсе c (что имеет смысл, поскольку у него есть коммит, которого на самом деле больше нигде нет - верно?)
Редактировать: A немного больше информации:
Когда я делал git push production master
как обычно, а production
был копией master
, у меня никогда не было этой проблемы
Это не имеет отношения к тому, что в .gitignore
. Файлы, о которых я говорю, никогда не были ни в .gitignore
, ни .prodignore
. Я упомянул их только для справочной информации и почему мне нужно сделать коммит на производство, которое никогда не выдвигается к источнику. Это просто происходит, если я:
- Создаю любой случайный файл, скажем "test.txt"
- Pu sh, файл
origin
- Pu sh файл в
production
с помощью описанных выше шагов - Удалить файл
- Pu sh Удалить в
origin
(файл больше не находится в репо) - Pu sh удаление до
production
с использованием вышеуказанных шагов (файл по какой-то причине все еще на production
сервере)
Если я никогда не вытяну sh файл с production
для начала, просто с origin
, а затем удаляю его, он никогда не закончится на production
.
production
is насколько мне известно, безупречный репо, если это поможет.