别名未产生预期结果

时间:2017-01-27 18:43:22

标签: git bash jekyll alias

在我的.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

解决了在自身内部移动文件夹的错误,但不是主要问题。

2 个答案:

答案 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(...)构建网站并将其推送到回购

OP temp问题

首先我认为使用temp本身是一个容易出问题的来源

mv * .temp/               
&& mv .temp/_site/* .        # keep the generated _site folder
&& rm -rf .temp              # and remove ALL the jekyll sources!
&& touch .nojekyll`

从源文件夹运行上述命令将删除重建站点所需的所有源。

一般解决方案

  1. 从源文件夹构建:./
  2. 转到目标文件夹:_site/,并将其内容推送到您的deploy_branch:gh-pages
  3. 可选择返回源文件夹,源分支:static_build
  4. 使用以下命令:

    # 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自动执行部署过程。

    rake是一个简单的ruby构建程序,可以让您更好地控制构建任务。所以你可以在出现错误时提前退出,或者如果git repo是干净的则不要更新。

    • Rakefile添加到主文件夹
    • 在其中定义您的任务(例如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