2010-09-13 206 views
58

使用一个官方存储库作为远程存储库,并从中克隆多个本地存储库,可以在该主存储库上编写预提交钩子并在其所有克隆上执行该预钩子?Git远程/共享预提交钩子

+4

如果您想*执行*,请在中央仓库中使用更新钩子。如果挂钩正在执行每次提交验证,则仍然可以提供预提交挂钩;开发人员可能会自愿采用这种方法,以便在他们做错事情时能够立即找到答案,而不是等到他们试图推动。 – Cascabel 2010-09-13 18:34:17

+1

可能的重复: (http://stackoverflow.com/questions/3462955/)和 (http://stackoverflow.com/questions/427207/) – blong 2012-12-10 04:18:10

回答

46

我不这么认为,因为钩子没有被克隆。
可能是钩子脚本本身是版本控制的,然后链接到克隆服务器(符号链接)(提供他们的操作系统支持链接功能)。

或者,如果挂钩是用于创建克隆的git template directory的一部分(这只会确保它们存在于克隆repo中,但不能保证它们实际被使用和执行)。

但我不认为有任何“中心”的方式来执行提交。


由于Jefromi在评论(重点煤矿)解释得更加清楚:

我认为这真的违背了git仓库的想法已经与回购分布式执行挂钩。
我的克隆是我的存储库。我应该可以使用git,不过我喜欢,包括选择是否运行钩子。
(而从安全角度来看,这会是真的有种可怕的 - 没有人应该有逼我,每当我运行某些Git命令来执行某些脚本的能力)

我与评论表示赞同,并且只能在特定的专门回购协议中看到实施适用于当地规则的方法。
例如,您不会直接推送到中央仓库,而是首先推送到QA仓库,只有遵循特定规则才能接受您的提交。如果确实如此,那么质量保证回购会将您的承诺推向中央回购。

另一个例证来自我刚才提到的将是直接导出“Serverless Continuous Integration with Git”的方式来执行任意位置推动他们之前的作品本地私有构建。

+6

我认为它真的违背了git仓库的想法强制挂钩与回购分销。我的克隆是*我的*库。我应该可以使用git,不过我喜欢,包括选择是否运行钩子。 (从安全角度来看,这真的有点吓人 - 当我运行某些git命令时,没有人能够强制我执行某些脚本。) – Cascabel 2010-09-13 18:36:05

+1

@Jefromi:你知道什么是scarry?当我输入评论时,在提交我编辑的答案之前,我开始输入'add ...',并且我的电脑上的FireFox确实提出了我:“添加Jefromi的评论”。这不是我第一次去那里,显然;) – VonC 2010-09-13 19:20:59

+0

注意自我:另见http://stackoverflow.com/questions/3209208/what-is-the-cleverest-use-of-source-repository-that-you -have-ever-seen/3209767#3209767 – VonC 2010-09-13 19:25:42

5

是否可以在该主存储库上编写预提交钩子并在其所有的克隆上执行?

githooks(5)

 
    pre-commit 
     This hook is invoked by git commit, and can be bypassed with 
     --no-verify option. 

由于钩可以很容易地绕过,似乎回答你的问题是“不”。

此外,由于.git/hooks目录未被克隆,因此似乎没有将其推送到客户端的机制。

8

你不能在人的本地仓库上预先提交钩子,但在你的中央仓库中,你仍然可以运行预接收钩子。

F. ex我需要确保提交消息遵守某些规则(对于trac集成等) 所以我使用了以下预接收钩子,它检查每个提交消息被推送到中央存储库,并将拒绝如果没有受到欢迎,则推送。

 
#!/bin/sh 
while read rev_old rev_new ref 
do 
    MALFORMED="$(git rev-list --oneline $rev_old..$rev_new | egrep -v '#[0-9]+' | awk '{print $1}')" 
    if [ x"$MALFORMED" != x ] 
    then 
     echo Invallid commit message on $MALFORMED 
     exit 1 
    fi 
done 

更多信息请参见f.ex https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

2

假设你有源代码中有一个与之相关的构建系统的混帐回购协议,则可以配置构建系统建立前提交挂钩,即通过移动或链接〜版本化的预提交钩子。

我还没有尝试过。当我用Google搜索一个更好的解决方案时,我来到了这里。