在我的.bashrc中,我有以下别名设置:
alias sitebuild='bundle exec jekyll build; git checkout gh-pages; git rm * && mkdir temp && mv * temp/ && mv temp/_site/* . && rm -rf temp && touch .nojekyll; git status; git add .; git commit -am "update"; git push --all origin'
关于我为什么要这样做的一些解释:我使用Jekyll和gh-pages
构建网站,除了我已经开始使用GitHub不支持的插件,所以我必须在本地构建网站并将其推送到repo(而不是让GH为我远程构建网站)。
我的系统如下:我在我的网站static_build
上工作,提交我的提交并构建_site/
(包含所有最终的HTML)。然后,我需要将static_build:_site/
的内容复制到gh-pages:_site/
,然后将其推送到那个。
据我所知,上面的命令sitebuild
应该为我做这个(实际上当我在shell中单独运行每个参数时会这样做);但是,它没有。
知道为什么吗?
编辑:我觉得它可能与
有关mv * temp/
当我单独运行每个命令时,输出
mv: rename temp to temp/temp: Invalid argument
在这种情况下,终端似乎抱怨但仍然符合(ls
显示目录中只剩下temp
),但是当别名运行时,这可能不再是真的吗?
编辑2:改为使用
mv `ls -A | grep -v temp` ./temp
解决了在自身内部移动文件夹的错误,但不是主要问题。
答案 0 :(得分:1)
正如评论中所指出的, 问题(如果不是 问题)是试图将*
移入自身。避免这种情况(并用shell函数替换别名)的一种方法是使临时目录成为bash
不匹配的东西。假设您没有使用dotglob
' sitebuild () {
bundle exec jekyll build
git checkout gh-pages
git rm * -r --ignore-unmatch &&
mkdir .temp && mv * .temp/ && mv .temp/_site/* . && rm -rf .temp &&
touch .nojekyll
git status
git add .
git commit -am "update"
git push --all origin
}
选项:
Root
答案 1 :(得分:0)
[自动]在本地使用Jekyll和gh-pages(...)构建网站并将其推送到回购
temp
问题首先我认为使用temp
本身是一个容易出问题的来源
mv * .temp/
&& mv .temp/_site/* . # keep the generated _site folder
&& rm -rf .temp # and remove ALL the jekyll sources!
&& touch .nojekyll`
从源文件夹运行上述命令将删除重建站点所需的所有源。
./
_site/
,并将其内容推送到您的deploy_branch:gh-pages
static_build
使用以下命令:
# 1
bundle exec jekyll build
# 2
&& cd _site
&& git checkout -b gh-pages
&& touch .nojekyll
&& git add . && git commit -am "update"
&& git push origin gh-pages
# 3
&& cd ../ && git checkout -b static_build
(除此之外:上面的命令应该是单行,删除#
,然后删除line break
或使用\
将其转义以使其正常工作)
有关如何配置GitHub以使用不受支持的Jekyll网站插件的详细说明,请查看此SO answer
rake是一个简单的ruby构建程序,可以让您更好地控制构建任务。所以你可以在出现错误时提前退出,或者如果git repo是干净的则不要更新。
deploy
任务)rake deploy
或仅rake
进行部署。 例如一个简单的Rakefile
,可以帮助您完成上述操作。
# == Helpers ======================================
# return `false` in case of error
# `nil` if git output doesn't contain "clean"
# "clean" (a truthy value) if it contains it
def clean?
puts status = `git status`
clean = ($? == 0) && status.match(/clean/)
end
# == Tasks ========================================
task :build do
system "bundle exec jekyll build"
end
task :deploy => [:build] do
Dir.chdir("_site") do
system "git checkout -b gh-pages"
exit if clean? == false
unless clean?
system "git add . && git commit -am 'update'"
end
system "git push --all origin"
end
end