Развертывание игнорируемой папки dist на страницах GitHub

Я создал репозиторий Git для библиотеки JavaScript. Репозиторий также содержит демонстрационный веб-сайт, использующий связанную библиотеку, созданную в папке dist/. Теперь я хотел бы развернуть этот веб-сайт на страницах GitHub.

Однако у меня есть папка dist/ в моем .gitignore, и я бы предпочел, чтобы она оставалась игнорированной.

Есть ли способ автоматически сгенерировать ветку gh-pages, которая должна включать в себя dist/, но не включать ветку master?


person Baleb    schedule 02.02.2018    source источник
comment
Подсказка 1: .gitignore в разных ветках может быть разной; .gitignore в ветках code и doc конечно должны быть разные. Подсказка 2: вы можете добавлять и фиксировать даже игнорируемые файлы: git add --force.   -  person phd    schedule 02.02.2018


Ответы (4)


Зафиксируйте этот скрипт и вызовите его после создания dist:

#!/bin/sh

git commit -am "Save uncommited changes (WIP)"
git branch --delete --force gh-pages
git checkout --orphan gh-pages
git add -f dist
git commit -m "Rebuild GitHub pages"
git filter-branch -f --prune-empty --subdirectory-filter dist && git push -f origin gh-pages && git checkout -

Я использую его для этого ;-)

person Philippe    schedule 02.02.2018
comment
Может быть, вы могли бы добавить git reset после выполнения git checkout --orphan gh-pages? в противном случае все отслеживаемые файлы на master (не только dist) будут зафиксированы на gh-страницах ветки (конечно, в конце команда git filter-branch ... очистит содержимое за пределами папки dist, но я считаю, что более идиоматично делать git reset после касса для сирот) - person ErikMD; 03.02.2018
comment
Кстати, недостатком этого решения является то, что мы теряем историю gh-страниц ветки при каждом вызове скрипта. (Если это проблема для OP, этот недостаток не возникает с решением bash Я упомянул в своем ответе.) - person ErikMD; 03.02.2018
comment
Если подумать, в этом случае лучше не делать git reset после git checkout --orphan gh-pages, потому что если есть файл, например. README.md как в dist, так и в корневой папке репозитория, команда git filter-branch ... вызовет error: Untracked working tree file 'README.md' would be overwritten by merge. - person ErikMD; 03.02.2018
comment
@ErikMD Действительно, история gh-страницы потеряна, но для меня это не проблема (сделал это по дизайну, чтобы не было 2 длинных истории параллельно при просмотре истории ветвей). Но удаление git branch и --orphan должно решить эту проблему, если вы хотите сохранить историю. - person Philippe; 03.02.2018

Подводя итог вашему контексту:

  • ваша текущая ветка master
  • у вас есть папка dist/, которая игнорируется и не отслеживается
  • содержит исходники веб-сайта, которые могут обслуживаться статически
  • вы хотите опубликовать эту папку dist/ на страницах GitHub, используя ветку gh-pages.

Кажется, самый простой способ сделать это — следовать рабочему процессу, предложенному в этом суть, а также в документация Yeoman< /а>.

Но обратите внимание, что это зависит от расширенной команды git subtree и требует, чтобы папка dist/ не игнорировалась и не отслеживалась также на master.

Затем вы можете следовать документу, касающемуся конфигурации GH. Источник публикации страниц.

Отвечает ли это на ваш вопрос или вы действительно хотите, чтобы две ветки были разделены и не было файла dist/* в ветке master?

В последнем случае проблема более сложная (из-за неотслеживаемых или игнорируемых файлов в рабочем дереве, которые могут помешать процессу...), но вы можете взглянуть на этот проект, который является альтернативой решению на основе git subtree и основан на сценарии Bash.

(Примечание: я не тестировал это решение "git-directory-deploy"; оно было предложено в суть я упомянул выше.)

person ErikMD    schedule 02.02.2018

В качестве альтернативы можно использовать Travis CI или другой инструмент непрерывной интеграции для автоматического создания сборки и развертывания сгенерированных файлов в ветке gh-pages: Развертывание страниц GitHub

person Baleb    schedule 09.05.2018

Благодаря этой записи в блоге я наконец нашел удобный способ подделать фиксацию из подпапки, игнорируемой git, поверх другой ветки. Я лично использую его для выпуска собранного пакета npm в выделенной для выпуска ветке.

Использование такого решения является очень гибким, сохраняет историю (нет необходимости в принудительном нажатии), но включает больше внутренних компонентов git:

#!/usr/bin/env bash

# Environment
BUILD_DIR="dist"
RELEASE_BRANCH="gh-pages"
VERSION="$(jq -r ".version" package.json)"

# Script
git fetch origin $RELEASE_BRANCH
git add -f $BUILD_DIR
tree=$(git write-tree --prefix=$BUILD_DIR)
git reset -- $BUILD_DIR
identifier=$(git describe --dirty --always)
commit=$(git commit-tree -p refs/remotes/origin/$RELEASE_BRANCH -m "Deploy $identifier as v$VERSION" $tree)
git update-ref refs/heads/$RELEASE_BRANCH $commit
git tag -a "v$VERSION" -m "Release tag for $VERSION" $commit
git push --follow-tags origin refs/heads/$RELEASE_BRANCH
person hlobit    schedule 26.03.2020