问题完整重写
我以为我非常简单明了地解释了这个问题,但似乎我过于简化了,所以在这里提供所有的额外细节。希望这可以帮助每个人看到这也不是一个重复的问题。
我有一个仓库(项目),我想自动化从一个分支中的一个目录推送提交到另一个分支的过程;这是我在SO上还没有遇到过的事情。
这是我的项目及其完整结构:
[PROJECT MASTER BRANCH]
|- gh-pages (directory)
|- css (directory)
|- index.html (file)
|- readme.md (file)
[PROJECT gh-pages BRANCH]
|- (empty at the moment)
我希望创建一个钩子,能够自动处理从主分支到我的 gh-pages 目录的更改,并将它们(无论是复制、克隆还是替换)到我的 gh-pages 分支,即项目网站分支。这里有一个例子,省略了所有其他文件:
[PROJECT MASTER BRANCH]
|- gh-pages (directory) <=== SEE UPDATE BELOW [A]
| |- css (directory)
| | |- style.css (file)
| |- index.html (file)
[PROJECT gh-pages BRANCH]
|- css (directory) <=== SEE UPDATE BELOW [B]
| |- style.css (file)
|- index.html (file)
我完全是新手级别的 Git Hub 用户,通常只使用基础功能,从不使用终端/ shell。为了澄清我的意图,我希望做到以下几点:
- 只需要在 [Master Branch] 中工作。所有需要对 [gh-pages Branch] 做出的更改,都在 [Master Branch] 的 gh-pages 目录中完成。
- 最好通过添加一个简单的文件来实现这个目标,似乎这个文件应该是 post-receive hook?
#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" == "$branch" ]; then
git checkout gh-pages
git checkout master -- gh-pages
git add gh-pages
git commit -m "Updating project website from 'master' branch."
fi
done
注意
正如我在评论中提到的那样:这不是重复问题。这不是在问如何推送,而是如何添加其他命令,当我进行普通推送时自动运行这些命令。这些命令将执行我在原始帖子中提到的额外工作。
更新
我已经在下面引用了我的代码,并添加了箭头: <===
[A] 这里应该发生的是Git应该递归读取主分支gh-pages目录,并将更新的内容(或如果更容易则全部内容)复制到gh-pages分支中。
[B] 因此,如果主分支的gh-pages目录中有一个index.html文件和一个css文件夹,其中包含一个style.css文件,则只应复制该结构,而不是gh-pages目录本身。下面是一个错误的钩子示例,它也复制了gh-pages目录:
[PROJECT gh-pages BRANCH]
|- gh-pages (Directory) <=== NOT SUPPOSED TO HAPPEN
| |- css (directory)
| | |- style.css (file)
| |- index.html (file)
此外,钩子不应复制除gh-pages内部文件以外的任何其他文件。即使主分支中有多个其他文件更改,也只应复制gh-pages目录文件。 [C] 新代码 - 这段代码可以工作,但会导致错误:
#!/bin/bash
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "master" == "$branch" ]; then
git fetch && git checkout gh-pages
git checkout master -- gh-pages/*
git add -A
git commit -m "Updating project website from 'master' branch."
git push -u origin gh-pages
fi
这种方法有两个问题。1)如果存储库滞后于提交,它无法处理,会出现错误;如果使用pull而不是fetch,则本地存储库被清除如下: 如果我保留fetch,则本地存储库保持不变: 2)整个gh-pages目录仍然被复制到gh-pages分支中,而不仅仅是其中的文件。