如何在Github Pages分支上正确地提交至仓库

4

我有一个问题。

基于 gh-pages 的情况。

我的项目使用预处理器和其他复杂的工具,因此,我的项目结构如下:

主分支

./-|
   /src
   /node_modules
   /public-|
       /js
       /css
       /etc
       index.html           
   /etc
   package.json 
   etc

所有的代码源文件都在src文件夹中,编译后放置在public文件夹中。
public文件夹也被添加到了.gitignore中。
我想将我的public文件夹中的所有文件提交到gh-pages分支中。这可能吗?如果可以,如何操作?下面是我的gh-pages分支的结构:

gh-pages分支

 ./-|
    /js
    /css
    /assets
    index.html    

我认为运行 grunt/gulp 任务并将结果提交到另一个分支会非常好。


相关链接:https://dev59.com/h1rUa4cB1Zd3GeqPmLDK - krlmlr
嘿@Martijn Pieters,这个问题不是另一个问题的副本,我的答案也是最合适的。请考虑恢复它。 - Dan Dascalescu
3个回答

4

我有一对脚本可以完全做到这一点。在我的情况下,文档源位于(当然是相对于脚本运行的位置),生成的文档位于_build/html,我发出以下命令:

touch _build/html/.nojekyll    # disable GitHub's Jekyll page generator
./commit-to-gh-pages.sh _build/html

where commit-to-gh-pages.sh is

#! /bin/sh

# Commit the generated HTML pages to the branch gh-pages.
# Will not push them to GitHub.

set -e -v

treehash=$(./hash-tree.py "${1:-_build/html}")
parent=$(git rev-parse gh-pages)

msg="Regenerated docs for $(git rev-parse HEAD)"
commithash=$(echo "$msg" | git commit-tree $treehash -p $parent)
echo "Updating gh-pages to $commithash"
git update-ref refs/heads/gh-pages "$commithash"

这将把目录_build/html写入Git索引,创建一个提交对象,其内容正好是该目录树,并将提交对象写入gh-pages分支,以该分支的先前状态作为父级。
棘手的部分是hash-tree.py脚本,它扩展了git hash-object命令以处理目录树。我不会复制粘贴它,但您可以在这里找到它。(如果有更优雅的方法,请告诉我。)

我需要一些时间来理解这个脚本,其中一些git命令我在第一次看到。 - Ifozest
@Viachaslau 我在开始编写这个之前也不认识它们 :) 这些命令是“管道”的一部分,http://git-scm.com/book/en/Git-Internals-Plumbing-and-Porcelain - Fred Foo
这很有趣!对于人类使用来说可能不太理想,但在脚本环境中可能非常理想。 - krlmlr

3

我曾经在将repo克隆到自己的子目录并检出不同分支方面有过出色的经验:对于你的情况,可以尝试类似以下操作:

# add public to .gitignore
git clone . public
cd public
git checkout --orphan gh-pages
git reset --hard
git commit --allow-empty "initial"

这将帮助你入门。请参阅http://krlmlr.github.io/git-subbranch了解更多信息。


1
如果您的git版本大于1.7.11,您可以尝试使用git subtree。我自己也很难理解细节,所以我不会试图解释它,但是Hugo网站构建器上有一个教程。相关部分从标题配置git工作流程开始。

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