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

时间:2015-02-06 01:32:00

标签: wordpress git githooks

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

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

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

  1. 提交Git更改
  2. 压缩整个文件夹
  3. 打开zip文件并删除.git文件夹,grunt文件和所有其他特定于开发的文件
  4. 发布新邮政
  5. 我不知道实现这一目标的最佳方式,但我非常非常熟悉Git钩子,我有这样的想法:我可以设置吗?一个Git钩子,它只将所需的生产文件压缩成一个ZIP文件并用repo存储它?这样,每次我提交它都会自动创建一个新的ZIP版本。

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

    哦,我也在Windows上(·_·;)。所以我希望能在Windows上实现这一目标。

2 个答案:

答案 0 :(得分:4)

我不能代表Windows,但是:

  1. 技术上可以在预提交挂钩中执行此类操作。
  2. 别。
  3. 修改“你将提交的内容”的预提交钩子很烦人(如果没有别的话,它违反了“最不惊讶的规则”,你的版本控制系统只存储你告诉它存储的版本)。除此之外,存储大型预压缩二进制文件会干扰git尝试节省包文件中的空间,并且会导致存储库快速膨胀,性能低下,内存不足等等。 ZIP-archive 是一个预压缩的二进制文件,因此表现不佳。

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

    [编辑:我原本考虑git archive,但没有意识到你可以方便地排除文件,所以请写下面的内容。所以,jthill's answer更好,应该是一个人的第一手段。如果出于某种原因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
    

    (以上大部分内容都是样板文件,我已将其删除至必需品)。您必须编写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
    }
    

答案 1 :(得分:3)

实际上有一个命令,git archive

git archive master -o wizzo-v1.13.0.zip

参见EXAMPLES部分,您可以选择路径,为它们添加前缀,通过输出扩展定义自定义后处理,以及一些更小的调整。

另请参阅ATTRIBUTES部分:您可以提供文件 - 实际上是任意模式 - export-ignore属性,以便将其从档案中排除。

它有一些更方便的花花公子,你可以从远程回购获得档案,扩展任意git log --pretty=format:占位符,git手册绝对值得你随时投资。