有没有办法在遥控器上发生git pull时挂钩(类似于预接收或后接收)。基本上我希望能够让遥控器在拉动时提供任何东西。
在我的情况下,遥控器上的任何内容都是权威来源,可以在没有git提交的情况下进行修改。我想确保当我拉动时,我总能得到最新的任何现场。
答案 0 :(得分:3)
首先,回答你的实际问题:当有人抓取时,远程端没有调用钩子。 (当有人拉扯时,所有遥控器都知道他们是从中取出的 - 它不知道他们是跑了git pull
,git fetch
,git remote update
......)
至于你的实际情况:我同意Magnus的说法,最好只是在编辑后进行提交,或者失败,有某种周期性任务(cronjob?)检查修改和提交,如果它发现任何。如果你不喜欢这些选择中的任何一个,那么你就可以简化一些事情,这样你就可以快速轻松地在拉动之前触发远程存储库中的提交。
另外,我建议不关于使用工作树作为规范存储库的存储库。如果你需要推动它,它会遇到麻烦。相反,您可以拥有一个裸的规范存储库,您的实时存储库会在提交后推送到该存储库,并在该裸存储库中安装post-receive挂钩以在必要时更新实时存储库。
答案 1 :(得分:1)
不幸的是,git本身并没有为此提供钩子,因为它是一个完美的用例,想要在允许拉/取之前检查一些东西。
我不知道你的'遥控器'是否在本地机器上,但如果不是,请看一下gitolite,它的钩子就是这样的:
“gl-pre-git”hook
虽然git有很多很好的钩子你可以使用,但它们都可以运行 只是推动。在获取或克隆上没有任何东西可以运行 在git-receive-pack或之前无法运行某些东西
这就是gl-pre-git hook的用途。如果一个可执行钩子调用 gl-pre-git存在,它将使用当前目录调用 设置为repo.git,并使用单个参数,它将是R或 W取决于客户尝试做什么。
对于v3 gitolite,这里是the docs about triggers。文档有点神秘,但这是它的工作原理:
在〜/ .gitolite.rc中添加(在全局范围内):
PRE_GIT =>
[
'<pre_git_trigger_script_name>'
]
在同一个文件中查看允许设置LOCAL_CODE的行并将其设置为您喜欢的位置
在为LOCAL_CODE设置的目录中,创建一个名为“triggers”的子目录,并创建一个名为<pre_git_trigger_script_name>
的脚本,其中包含您想要执行的操作...(请确保执行以下操作: chmod +x <pre_git_trigger_script_name>
运行gitolite setup
test&amp;&amp;祝你有个美好的一天
更新:实际上使用gitolite,我认为你可以让pre-git触发器做一些事情,比如推送到一个不存在的分支,然后在非裸存储库中挂钩预先接收以拒绝推送,但要在此过程中执行git add --all . && git commit -m"autocommit" && push gitolite
。当您不希望允许gitolite托管用户权限直接在非裸存储库中运行命令时,这很方便。
答案 2 :(得分:0)
我没有使用git hook的直接经验,this page可能会有所帮助,但看起来你似乎无法做到这一点。
更简单(更好的IMO)解决方案是使用生产环境以外的仓库作为权威来源。你能做这个吗?生产环境很少被用作权威来源,因为最新且最稳定的是两个非常不同的东西......
仅供参考,我只是在生产环境中曾执行git pull或git状态。对我的本地仓库进行任何更改,测试,提交,推送到github,然后下载到生产环境。
<强>更新强>
我应该指出,git的一大优势和特性是它是一个分布式源代码控制系统。因此,实际上没有任何权威来源。
答案 3 :(得分:0)
我认为你不能用钩子来做这件事,因为我理解读钩子的文件没有符合你要求的钩子。
如果我需要类似你想要的东西,我会在'remote'上创建一个每小时运行一次的脚本,并检查是否有任何文件发生了变化( git status )并全部提交( git commit -a -m“自动提交”)。
答案 4 :(得分:0)
这不是我以前做过的事情,但你可以从php里面运行bash脚本:
http://www.devx.com/opensource/Article/40785
http://us2.php.net/function.exec
这应该允许您通过PHP脚本提交和推送一组更改。查看界面或将其集成到当前的编辑过程中,您应该好好去。
答案 5 :(得分:0)
编辑此文件的人/是什么?如果某人在某个网站上进行了某些更改时发生了某些变化,则必须由某些内容触发,这意味着您可以将其自动化。当这件事发生并且文件被保存时,你应该触发提交。提交必须在某个时间完成,也可能在那个时候完成。