wordpress - 预提交 Git Hook 可以压缩目录并将其添加到存储库吗?

标签 wordpress git githooks

我正在开发 Wordpress 插件。我的开发目录包含许多特定于开发的内容(例如 Grunt 文件、Sass 文件、git 存储库本身等)。

显然,我不想分发包含所有这些开发文件的文件夹;人们在下载我的 Wordpress 插件时不想要几 MB 的 Grunt 文件。

不过,到目前为止,我的“发布”过程一直很麻烦:

  1. 提交 Git 更改
  2. 压缩整个文件夹
  3. 打开 zip 文件并删除 .git 文件夹、grunt 文件和所有其他特定于开发的文件
  4. 发布新的zip

我不知道完成此任务的最佳方法,但我非常隐约熟悉 Git 钩子(Hook),我有这样的想法:我可以设置一个 Git 钩子(Hook)吗?会只将需要的生产文件压缩到一个 ZIP 文件中并将其与存储库一起存储吗?这样,每次我提交时它都会自动创建一个新的发布 ZIP。

这可能吗?如果是这样,有人可以指出我正确的方向吗?

哦,还有,我在 Windows 上 (·_·;)。所以我希望有一种方法可以在 Windows 上执行此操作。

最佳答案

我不能代表 Windows,但是:

  1. 技术上可以在预提交 Hook 中执行此类操作。
  2. 不要。

修改“你将提交的内容”的预提交 Hook 很烦人(如果不出意外,它违反了“最小惊讶规则”,即你的版本控制系统只存储你告诉它要存储的版本)。除此之外,存储大型预压缩二进制文件会干扰 git 在包文件中节省空间的尝试,并会导致存储库快速膨胀、性能低下、内存不足等。 ZIP 存档预压缩的二进制文件,因此性能不佳。

一般来说,一种更合理的处理发布的“hook-y”方式是设置一个“发布服务器”,将新发布推送到该服务器,并让推送触发存档生成。 (有很多方法可以在没有单独的服务器/存储库的情况下做到这一点,您可以以更 pull 式的方式进行,但推式很容易说明。)

[编辑:我最初考虑过 git archive 但没有意识到您可以方便地使用它来排除文件,所以写了下面的内容。所以,jthill's answer比较好,应该是首选。在某些情况下,由于某些原因,git archive 可能无法执行,我将保留它作为替代方案。]

例如,这里有一个服务器端 post-receive 钩子(Hook)代码片段,它检查名称与 release* 匹配的分支是否已被推送到,如果是的话, 调用带有分支名称的 shell 函数(对每个这样的分支调用一次):

#! /bin/sh

NULL_SHA1=0000000000000000000000000000000000000000

scan()
{
    local oldsha newsha fullref shortref
    local optype

    while read oldsha newsha fullref; do
        case $oldsha,$newsha in
        $NULL_SHA1,*) optype=create;;
        *,$NULL_SHA1) optype=delete;;
        *)            optype=update;;
        esac
        case $fullref in
        refs/heads/*)
            reftype=branch
            shortref=${fullref#refs/heads/}
            ;;
        *)
            reftype=other
            shortref=fullref
            ;;
        esac

        case $optype,$reftype,$shortref in
        create,branch,release*|update,branch,release*)
            do_release $shortref;;
        esac
    done
}

scan

(以上大部分是样板,我已将其精简为 Gist )。您必须编写 do_release 函数,它可能类似于(完全未经测试):

do_release()
{
    local tmpdir=/tmp/build.$$ # or use mktemp -d

    # $tmpdir/index is git's index; $tmpdir/t is the work tree
    trap "rm -rf $tmpdir; exit 1" 1 2 3 15
    rm -rf $tmpdir
    mkdir $tmpdir/t

    GIT_INDEX_FILE=$tmpdir/index GIT_WORK_TREE=$tmpdir/t git checkout $1

    # now clean out grunt files and make zip archive
    (cd $workdir/t; rm -rf grunt; zip ../t.zip .)

    # put completed zip archive in export location, name it
    # based on the branch name
    mv $workdir/t.zip /place/where/zip/files/live/$1.zip

    # clean up temp dir now, and no longer need to clean up
    # on signal related abort
    rm -rf $tmpdir
    trap - 1 2 3 15
}

关于wordpress - 预提交 Git Hook 可以压缩目录并将其添加到存储库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28357163/

相关文章:

WordPress - 针对特定页面上的特定 CSS 选择器

git - 如何在 SmartGit 中为不同的 Bitbucket 存储库使用不同的 key ?

Git:如何回滚到上次推送/提交

github - 如何将自定义 git Hook 添加到 GitHub Enterprise 存储库?

git - 自动将推送的文件从一个 GitHub 存储库复制到另一个

php - PHP7 上的 Opcache 是否预分配所有分配的内存?

css - 如何更改 WooCommerce 中结帐国家/地区选择时的悬停颜色?

wordpress 自定义帖子类型发帖时出错

git - 在 Android Studio 中回滚上次提交

Git 远程/共享预提交 Hook