11

当遥控器上发生 git pull 时,有没有办法挂钩(类似于预接收或后接收)。基本上我希望能够让遥控器在拉动时提交它所拥有的任何东西。

在我的情况下,远程上的任何内容都是权威来源,可以在没有 git 提交的情况下进行修改。我想确保当我拉动时,我总是能够获得最新的直播。

4

6 回答 6

4

首先,回答您的实际问题:当有人获取时,远程端没有调用任何钩子。(当有人拉动时,遥控器所知道的只是他们从中提取的——它不知道他们是否跑了git pullgit fetch... git remote update

至于您的实际情况:我同意 Magnus 的观点,即最好在编辑后简单地进行提交,否则,有某种定期任务(cronjob?)检查修改并在发现时提交。如果您不喜欢这些选择中的任何一个,那么您可以简化事情,以便在拉取之前快速轻松地触发远程存储库中的提交。

另外,我建议不要将具有工作树的存储库作为您的规范存储库。如果您需要推动它,那就是自找麻烦。相反,您可以拥有一个裸规范存储库,您的实时存储库在提交后推送到该存储库,并在该裸存储库中安装一个 post-receive 挂钩以在必要时更新实时存储库。

于 2012-01-05T18:38:40.870 回答
2

不幸的是,git 本身并没有为此提供钩子,因为它是一个完美的用例,希望在允许拉取/获取之前检查某些内容。

我不知道您的“远程”是否在本地计算机上,但如果不是,请查看 gitolite ,它具有专门用于此目的的钩子:

来自v2 gitolite 文档

“gl-pre-git”钩子

尽管 git 有很多不错的钩子可供您使用,但它们都只能在推送时运行。在 fetch 或 clone 上没有运行任何东西,并且在调用 git-receive-pack 或 git-upload-pack(视情况而定)之前无法运行某些东西。

这就是 gl-pre-git 钩子的用途。如果存在名为 gl-pre-git 的可执行钩子,它将在当前目录设置为 repo.git 的情况下调用,并使用单个参数,根据客户端尝试执行的操作,该参数将是 R 或 W。

对于 v3 gitolite,这里是有关 triggers 的文档。文档有点神秘,但它是这样工作的:

  1. 在 ~/.gitolite.rc 添加(在全局范围内):

    PRE_GIT => [ '<pre_git_trigger_script_name>' ]

  2. 在同一个文件中查看允许设置 LOCAL_CODE 并将其设置为您喜欢的任何位置的行

  3. 在您为 LOCAL_CODE 设置的目录中,创建一个名为“triggers”的子目录并创建一个脚本,调用该脚本<pre_git_trigger_script_name>时您想要执行的任何操作...(确保执行以下操作:chmod +x <pre_git_trigger_script_name>

  4. gitolite setup

  5. 测试&&祝你有美好的一天

更新:实际上使用 gitolite,我认为你可以让 pre-git 触发器做一些事情,比如推送到一个不存在的分支,然后挂钩到你的非裸存储库中的预接收以拒绝推送,但要git add --all . && git commit -m"autocommit" && push gitolite在这个过程中做。当您不想让 gitolite 托管用户权限直接在您的非裸存储库中运行命令时,这很方便。

于 2013-11-24T04:14:33.617 回答
0

这不是我以前做过的事情,但是您可以从 php 内部运行 bash 脚本:

http://www.devx.com/opensource/Article/40785
http://us2.php.net/function.exec

这应该允许您通过 PHP 脚本提交和推送一组更改。在它上面添加一个界面或将其集成到您当前的编辑过程中,您应该很高兴。

于 2010-05-08T21:41:36.487 回答
0

我认为你不能用钩子来做到这一点,因为我理解阅读钩子的文档没有符合你要求的钩子。

如果我需要你想要的东西,我会在“远程”上创建一个每小时运行一次的脚本,并检查是否有任何文件发生更改(git status)并提交所有文件(git commit -a -m "Auto commit")。

于 2010-05-08T19:57:06.600 回答
0

谁/什么在编辑这个文件?如果有人在网站上更改某些内容时发生了更改,则必须由某些内容触发,这意味着您可以自动执行此操作。当发生这种情况并保存文件时,您应该在那里触发提交。提交必须在某个时间完成,也可能在那个时候完成。

于 2011-04-27T21:08:26.697 回答
0

我没有 git hooks 的直接经验,这个页面可能会有所帮助,但看起来你无法做到。

更简单(更好的 IMO)解决方案是使用生产环境以外的存储库作为权威来源。你能做这个吗?生产环境很少用作权威来源,因为最新和最稳定是两个非常不同的东西......

仅供参考,我只在生产环境中执行 git pull 或 git status 任何更改都在我的本地 repo 上进行、测试、提交、推送到 github,然后下拉到生产环境。

更新
我应该指出,git 的一大优势和特点是它是一个分布式源代码控制系统。因此,实际上没有任何权威来源。

于 2010-05-08T16:23:05.817 回答