Bli*_*gle 5 git configuration github
完成问题重写
所以我认为我非常简单直接地解释了这个问题,但似乎我过于简单了,所以这里是所有额外的细节.希望这有助于每个人看到这也不是重复.
我有一个存储库(项目),我希望自动化将提交从分支中的一个目录推送到另一个分支的过程; 我还没有遇到过的东西.
这是我的项目的完整结构:
[PROJECT MASTER BRANCH]
|- gh-pages (directory)
|- css (directory)
|- index.html (file)
|- readme.md (file)
[PROJECT gh-pages BRANCH]
|- (empty at the moment)
Run Code Online (Sandbox Code Playgroud)
我希望做的是创建一个钩子,它将从主分支中自动处理我的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)
Run Code Online (Sandbox Code Playgroud)
我对这个级别的Git Hub完全陌生.我通常只是坚持基础,从不使用终端/外壳.总而言之,为了澄清我希望做的事情,我想:
这是我尝试使用的一些post-receive钩子代码(我是通过研究一些东西来实现的)但它不起作用:
#!/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
Run Code Online (Sandbox Code Playgroud)
注意
如我的评论中所述:这不是重复.这不是问如何推动,而是如何在我正常推送时自动运行的其他命令.这些命令可以完成我的OP中提到的额外工作.
更新
我已将这些箭头添加到我在下面引用的部分代码中:<===
[A]这里应该发生的是Git应该递归地读取主分支gh-pages目录,并且只从已更新的内容(或者更容易的内容)复制到gh-pages分支中.
[B]因此,如果master中的gh-pages目录有一个index.html文件,并且带有style.css文件的css文件夹应该只复制该结构而不是gh-pages目录本身.下面是一个复制gh-pages目录的坏钩子的例子:
[PROJECT gh-pages BRANCH]
|- gh-pages (Directory) <=== NOT SUPPOSED TO HAPPEN
| |- css (directory)
| | |- style.css (file)
| |- index.html (file)
Run Code Online (Sandbox Code Playgroud)
此外,钩子不应该复制任何其他文件,但gh页面内的内容.即使在主分支中更改了其他几个文件,也只应复制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
Run Code Online (Sandbox Code Playgroud)
这不会有两个原因.1)如果repo落后于提交它无法处理它,它将会出错; 如果使用pull而不是fetch,则本地repo会被擦除:
如果我离开fetch,本地仓库将保持应有的方式:
2)整个gh-pages目录仍然被复制到gh-pages分支,而不仅仅是其中的文件.
您确实不需要这种复杂的方法。
只需将您自己的存储库添加为子模块(本身!),子模块跟随分支gh-pages(因为子模块可以跟随分支的最新提交)!
git checkout master
git rm -r gh-pages # save your data first
git submodule add -b gh-pages -- /remote/url/of/your/own/repo
git commit -m "ADd gh-pages branch as submodule"
git push
Run Code Online (Sandbox Code Playgroud)
这样,您可以在主分支或gh-pages文件夹(实际上是子模块)中更改文件
每当您在文件夹中进行更改时gh-pages,请不要忘记在该文件夹以及存储库的主文件夹中提交,以便记录代表子模块的新 SHA1 的新gitlink(索引中的特殊条目gh-pages) 。
cd myrepo/gh-pages
# modify files
git add .
git commit -m "modify gh-pages files"
cd .. # back to myrepo folder
git add gh-pages
git commit -m "record gh-pages new SHA1"
git push
Run Code Online (Sandbox Code Playgroud)
使用 git 2.7+,您可以设置:
cd /path/to/main/repo
git config push.recurseSubmodules on-demand
Run Code Online (Sandbox Code Playgroud)
git push然后,主存储库中的单个子模块也会gh-pages将子模块推送到gh-pages分支。
稍后,一个git clone将克隆您的主存储库及其分支gh-pages(在gh-pages子模块文件夹中)。
这样,您始终可以看到这两个内容。
而且您不需要复杂的“同步/复制”机制。
2016 年 8 月更新:更简单的 GitHub Pages 发布现在允许将页面文件保存在同一分支的子文件夹中(不再gh-pages需要):
您不再需要子模块方法,因为您的寻呼机可以位于同一分支内的子文件夹中。
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |