我无法代表Windows,但是:
- 在预提交钩子中进行这种操作在技术上是可行的。
- 不要这样做。
修改“你将提交的内容”的预提交钩子很烦人(如果什么都没有,它违反了“最少惊讶规则”,即您的版本控制系统仅存储您告诉它要存储的版本)。除此之外,存储大型预压缩二进制文件会干扰git试图在包文件中节省空间的尝试,并会导致快速存储库膨胀、性能差、内存不足等问题。ZIP归档文件是一种预压缩二进制文件,因此会表现得很差。
通常,处理发布的更合理的“钩子式”方法是设置一个“发布服务器”,将新发布推送到其中,并触发存档生成。 (有一些方法可以在没有单独的服务器/存储库的情况下执行此操作,您可以以更拉式的方式执行此操作,但是推送样式易于说明。)
[编辑:我最初考虑使用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.$$
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
(cd $workdir/t; rm -rf grunt; zip ../t.zip .)
mv $workdir/t.zip /place/where/zip/files/live/$1.zip
rm -rf $tmpdir
trap - 1 2 3 15
}