预先提交的Git挂钩可以压缩目录并将其添加到存储库中吗?

Pet*_*ete 4 git wordpress githooks

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

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

但是到目前为止,我的“发布”过程很麻烦:

  1. 提交Git更改
  2. 压缩整个文件夹
  3. 打开zip文件并删除.git文件夹,grunt文件以及所有其他特定于开发的文件
  4. 发行新的邮编

我不知道实现此目标的最佳方法,但是我对Git钩子非常陌生,我有这样的想法:我是否可以设置一个Git钩子,使其仅将所需的生产文件压缩为ZIP文件并存储它与回购?这样,每次提交时,它将自动创建一个新的发行版ZIP。

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

哦,我也在Windows(?_ ?;)上。因此,我希望有一种方法可以在Windows上实现。

tor*_*rek 5

我不能代表Windows,但是:

  1. 技术上讲,可以在预提交的挂钩中执行此类操作。
  2. 别。

修改“您将要提交的内容”的预提交钩子很烦人(如果没有其他问题,则违反了“最小惊讶规则”,您的版本控制系统只是在其中存储您告诉它存储的版本)。除此之外,存储大型的预压缩二进制文件会干扰git尝试在打包文件中节省空间的尝试,并且会导致快速的存储库膨胀,性能下降,内存不足等。ZIP归档文件预压缩的二进制文件,因此将表现不佳。

通常,处理发行版的一种更合理的“挂钩”方法是设置一个“发行版服务器”,将新发行版推送到该“发行版服务器”,并让该推送触发存档生成。(有多种方法可以在没有单独的服务器/存储库的情况下执行此操作,您可以采用更拉式的方式进行操作,但推式很容易说明。)

[ 编辑:我本来考虑过git archive但没有意识到您可以方便地排除文件,所以在下面写下了。因此,jthill的答案更好,应该是第一个手段。在某些情况下出于某些原因git archive可能无法使用的情况下,我将保留此位置作为替代。]

例如,这是一个服务器端post-receive挂钩代码片段,它检查是否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
Run Code Online (Sandbox Code Playgroud)

(以上大部分内容都是样板,我已经精简了要点)。您将必须编写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
}
Run Code Online (Sandbox Code Playgroud)