我在.git/hooks
中定义了一个post-commit钩子,我想在服务器端执行(在我的例子中是Gitlab.com)。
背景:我在一个LaTeX项目中使用gitinfo2和一个post-commit钩子来引用有关pdf中最新git标签的信息。这在我的计算机上运行良好,但是当我将回购推送到Gitlab时失败了。
它不会导致错误,但会发出以下警告,这基本上意味着git挂钩从未执行过。
Package gitinfo2 Warning: I can't find the file '.git/gitHeadInfo.gin'.
(gitinfo2) All git metadata has been set to '(None)'.
从我到目前为止在线阅读,客户端git钩子不在服务器上执行 - 但为什么不呢?在这种情况下,我希望钩子在客户端和服务器上执行。
所以,基本上,我希望事件序列如下:
gitHeadInfo.gin
文件夹中创建一个名为.git
的文件。gitinfo
包帮助从gitHeadInfo.gin
中提取git版本信息。除了第3步,我已经完成了所有工作。因此,我目前的解决方法是在我的计算机上构建pdf并提交它而不是依赖于Gitlab CI。
git钩子的内容:
#!/bin/sh
# Copyright 2015 Brent Longborough
# Part of gitinfo2 package Version 2
# Release 2.0.7 2015-11-22
# Please read gitinfo2.pdf for licencing and other details
# -----------------------------------------------------
# Post-{commit,checkout,merge} hook for the gitinfo2 package
#
# Get the first tag found in the history from the current HEAD
FIRSTTAG=$(git describe --tags --always --dirty='-*' 2>/dev/null)
# Get the first tag in history that looks like a Release
RELTAG=$(git describe --tags --long --always --dirty='-*' --match '[0-9]*.*' 2>/dev/null)
# Hoover up the metadata
git --no-pager log -1 --date=short --decorate=short \
--pretty=format:"\usepackage[%
shash={%h},
lhash={%H},
authname={%an},
authemail={%ae},
authsdate={%ad},
authidate={%ai},
authudate={%at},
commname={%cn},
commemail={%ce},
commsdate={%cd},
commidate={%ci},
commudate={%ct},
refnames={%d},
firsttagdescribe={$FIRSTTAG},
reltag={$RELTAG}
]{gitexinfo}" HEAD > .git/gitHeadInfo.gin
客户端git hooks不在服务器上执行 - 但为什么不呢?
一般来说,你正在推动一个裸仓库(没有工作树的仓库,你不能直接进行任何提交) 因此,server-side commits更多地是关于执行策略而不是创建新提交。
如果你真的需要在服务器端创建新内容(特别是你没有直接控制的内容,比如GitLab.com),你需要:
这是一个适合我的解决方案。它确实要求您在repo的任何副本中执行一次两个短命令。
在您的回购的任何副本中,执行以下操作:
请注意,您只需在任何存储库中执行前两个步骤,而不是在每个本地副本中执行。
在回购的每个本地副本中,您需要