将忽略的 dist 文件夹部署到 GitHub 页面

Deploying ignored dist folder to GitHub Pages

我为 JavaScript 库创建了一个 Git 存储库。该存储库还包含一个使用捆绑库的演示网站,该库在 dist/ 文件夹中生成。我现在想将该网站部署到 GitHub Pages。

但是,我的 .gitignore 中有 dist/ 文件夹,我希望它保持忽略状态。

有没有办法自动生成 gh-pages 分支,它应该包含 dist/,但不包含 master 分支?

总结您的背景:

  • 您当前的分支是master
  • 您有一个 dist/ 文件夹被忽略且未被跟踪
  • 它包含可以静态提供的网站源代码
  • 您想使用 gh-pages 分支在 GitHub 页面上发布此 dist/ 文件夹。

执行此操作的最简单方法似乎是遵循此 gist 中建议的工作流程 以及 documentation of Yeoman.

但请注意,这依赖于高级命令 git subtree 并且要求 dist/ 文件夹也不会被忽略并在 master 上被跟踪。

然后您可以按照有关 configuration of GH Pages' publishing source.

的文档进行操作

这是否解决了您的问题,或者您是否真的希望将两个分支分开并且 master 分支中没有 dist/* 文件?

在后一种情况下,问题更复杂(因为工作树中未跟踪或忽略的文件可能会阻碍进程...)但您可能想看看 this project ,它是基于 git subtree 的解决方案的替代方案,并且基于 Bash 脚本。

(注意:我没有测试这个 "git-directory-deploy" 解决方案;它在我上面提到的 gist 中被建议。)

提交此脚本并在构建您的 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 -

我用它 ;-)

或者,可以使用 Travis CI 或其他持续集成工具自动创建构建并将生成的文件部署到 gh-pages 分支:GitHub Pages Deployment

感谢 this blog post,我终于找到了一种方便的方法来 从另一个分支 上的 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