2010-05-08 37 views
10

当远程发生git pull时,有没有办法挂钩(类似于预接收或后接收)。基本上,我希望能够让遥控器在发生拉力时承担任何事情。如何钩住遥控器上的git pull?

在我的情况下,远程机器上的任何东西都是权威性来源,可能会在没有git commit的情况下进行修改。我想确保何时拉动我总是能够获得最新的生活。

+1

所以,你发送一个提交到一个远程仓库,并希望远程仓库在你的更改被合并到它之前提交? – 2010-05-08 16:05:23

+0

不完全。更多类似这样的: 1:在远程fileA.txt被编辑 2:在本地我运行'git pull remote' 我想要的是编辑fileA.txt来获取commit'ed以便我的pull带来了所做的改变。 – Danny 2010-05-08 16:17:31

+0

为什么不在本地编辑fileA.txt,提交它,然后在远程服务器上执行pull操作?应该从开发人员的本地设置开始进行更改,然后逐渐进入生产环境,而不是相反。 – Mathew 2010-05-08 16:25:16

回答

0

我对Git钩子没有直接的经验,this page可能会有所帮助,但看起来你不会做到这一点。

更容易(和更好的IMO)解决方案将使用生产环境以外的回购作为权威来源。你能做这个吗?生产环境很少用作权威来源,因为最新的和最稳定的是两件非常不同的事情...

仅供参考,我只有在生产环境中执行git pull或git状态。任何更改都是在本地回购站上进行的,经过测试,提交,推送到github,然后下拉到生产环境。

UPDATE
我应该指出的是,强大的力量和Git的特点之一是,它是一个分布式控制系统。因此,实际上没有权威来源这样的东西。

+0

权威性可能不是合适的术语,更像是一个“同行”来源,这正是git所促进的。唯一的问题是,peer不能自己提交,所以我想弄清楚git钩子是否可以帮助它。 – Danny 2010-05-08 20:32:21

0

我认为你不能用钩子做这件事,因为我知道读钩子的文档没有符合你的要求的钩子。

如果我需要的东西像你想我想创建一个脚本什么“远程”运行每隔一小时,并检查是否有任何文件被改变(git的状态),并提交所有(git的承诺-a -m “自动提交”)。

+0

由于远程只是存储在云存储上的文件共享,因此不太可能。不过谢谢,我意识到这似乎并不存在。我有一个钩子,当我做一个推动时,不是一拉。我想我必须做一些空的提交+推送。 – Danny 2010-05-08 20:31:23

+0

尝试找到一种方法来本地安装此文件存储,以便您可以使用本地计算机git的命令。我猜如果可以将云存储作为本地存储访问,则可以直接从您的计算机执行所有操作。 如果云存储只是一个简单的存储,包含您的文件,并且恰好在.git目录里面,但没有运行Git,那就不可能钩住那里的东西。 – 2010-05-08 21:50:00

0

这不是我曾经做过,但你可以从内部运行PHP的bash脚本:

http://www.devx.com/opensource/Article/40785

应该使你可以提交,并通过推一组更改PHP脚本。查看界面或将其整合到您当前的编辑过程中,您应该很好。

0

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

+0

这假设远程实际上能够执行git命令。但在我的情况下,它是skydrive上的文件服务器/影子副本,我希望能够偶尔从Web进行编辑。 – Danny 2011-05-17 09:35:52

3

首先,回答您的实际问题:有人抓取时没有在远程端调用挂钩。 (当有人拉,所有的远程知道的是,他们从中获取的 - 它不知道他们是否跑git pullgit fetchgit remote update ...)

至于你的实际情况:我同意马格努斯它” d最好在编辑之后简单地进行提交,否则就会有某种周期性的任务(cronjob?)检查修改并在发现任何修改时提交。如果您不喜欢这两种选择,那么您只需简化一些操作,以便在拉动之前快速轻松地触发远程存储库中的提交。

另外,我建议而不是关于与作为规范存储库工作树的存储库。如果你需要推动它,它会要求麻烦。相反,您可以拥有一个纯粹的规范存储库,您的实时存储库在提交后将其推送到该存储库,并在该存储库中安装post-receive挂接以在必要时更新实时存储库。

+0

至于你的最后一段,那根本不能解决问题。这可以用gitolite完成,但是当有人从裸回购仓库中取出时,你如何让它告诉非裸用户提交一切,除非gitolite用户有直接权限来调用'git commit',这可能并不总是一个好主意。基本上,许多人需要的是能够用noop激发远程存储库上的钩子。这就是为什么人们认为抓取可能是好的,只是发现没有预取钩子。我认为这可能通过推到一个不存在的分支来解决... – nus 2014-04-20 05:17:14

+0

...这对像gitolite这样自动化的东西来说没问题,但是如果人们在做拉动之前必须记住这一点,那就很烦人...... – nus 2014-04-20 05:18:38

1

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

我不知道,如果你的“远程”是在本地机器上,但如果不是,看看gitolite其具有的正是意味着这个钩子:

v2 gitolite docs

“GL-预混帐”钩

虽然混帐它有很多不错的钩子,你可以挖掘的,他们都跑 仅在推。没有任何东西在提取或克隆上运行,并且在git-receive-pack或git-upload-pack(视情况而定)被调用之前无法运行某些东西。

这就是gl-pre-git钩子的用途。如果存在名为 的可执行钩子,则将使用设置为repo.git的当前目录 和单个参数调用gl-pre-git,该参数将为R或 W,具体取决于客户端尝试的内容做。

对于v3 gitolite,这里是the docs about triggers。该文档是有点神秘,但这里是它如何工作的:

  1. 〜/ .gitolite.rc增加(在全球范围内):在同一个文件

    PRE_GIT => [ '<pre_git_trigger_script_name>' ]

  2. 看看行允许设置LOCAL_CODE并将其设置为任何你喜欢

  3. 在您为LOCAL_CODE设置目录,创建一个名为“触发器”子目录,并创建一个名为<pre_git_trigger_script_name>脚本,不管你W¯¯蚂蚁做在这一点......(请务必不要到:chmod +x <pre_git_trigger_script_name>

  4. 运行gitolite setup

  5. 测试& &有好日子

更新:实际使用gitolite,我认为你可以让pre-git触发器执行某些操作,比如推送到一个未分支的分支,然后在非裸存储库中预先接收以拒绝推送,但要在p中执行git add --all . && git commit -m"autocommit" && push gitolite rocess。当您不希望允许gitolite托管用户权限直接在您的非裸仓库中运行命令时,这很方便。

+0

“没有办法在git-receive-pack或者git-upload-pack之前运行一些东西......“当然,除了用于他们之前......它只是代码。 – jthill 2013-11-24 04:38:56