将被忽略的dist文件夹部署到GitHub Pages

10

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

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

是否有一种方法可以自动生成应包含dist/gh-pages分支,但使其不出现在master分支中?


2
提示1:不同分支中的.gitignore文件可能不同;代码和文档分支中的.gitignore文件肯定是不同的。提示2:您可以添加并提交被忽略的文件:git add --force - phd
4个回答

14

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

我为此而使用它 ;-)


也许在执行 git checkout --orphan gh-pages 后,你可以添加 git reset?否则,主分支上所有已跟踪的文件(不仅是 dist 文件夹中的)都将提交到 gh-pages 分支中(当然,最终的 git filter-branch ... 命令将清除 dist 文件夹外的内容,但我认为在孤立检出后执行 git reset 更符合惯例)。 - ErikMD
顺便提一下,这种解决方案的缺点是每次调用脚本时都会丢失分支 gh-pages 的历史记录。(如果这对 OP 是个问题,那么我在我的答案中提到的 bash 解决方案 就不会出现这个缺点。) - ErikMD
重新考虑后,在执行git checkout --orphan gh-pages之后最好不要进行git reset,因为如果在dist文件夹和仓库根目录中都存在一个文件(例如README.md),那么git filter-branch ...命令将会引发错误:error: Untracked working tree file 'README.md' would be overwritten by merge. - ErikMD
1
@ErikMD 实际上,gh-page 的历史记录已经丢失了,但这对我来说不是问题(在设计时为了避免同时查看分支历史记录时出现过长的历史记录)。但如果想保留历史记录,则删除 "git branch" 和 "--orphan" 应该可以解决这个问题。 - Philippe

1
感谢这篇博客文章,我终于找到了一种方便的方法,在另一个分支的gitignored子文件夹中伪造提交。我个人使用它在专门的发布分支中发布已构建的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

1

总结一下您的情况:

  • 您当前的分支是 master
  • 您有一个被忽略和未跟踪的 dist/ 文件夹
  • 它包含可以静态服务的网站源代码
  • 您想要使用 gh-pages 分支在 GitHub Pages 上发布这个 dist/ 文件夹。

最简单的方法似乎是按照这个 gistYeoman 文档 中建议的工作流程进行操作。

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

您可以按照GH Pages发布源的配置文档进行操作。

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

如果是后一种情况,问题就更加复杂(因为工作树中未跟踪或被忽略的文件可能会阻碍该过程...),但您可以看一下此项目, 这是一个基于Bash脚本的git subtree解决方案的替代方案。

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接