2012-02-23 20 views
2

我想要在Windows上获得一个git post-receive钩子。Git - post-receive钩子不能在远程窗口服务器上工作

我使用Git 1.7.9(Msysgit),并且在本地有一个回购站,在远程服务器上有一个回购站。我可以获取,提交,推送等。我已经设置了一个post-receive钩子,它应该将文件检出到一个工作文件夹中(部署过程的一部分),但似乎不起作用。

这是我做的:

  1. 更改文件,舞台和它承诺
  2. 推送到远程服务器 - 成功
  3. 希望看到的回声 - 看不到回音
  4. 检查服务器上的工作文件夹 - 最新文件不存在
  5. 登录到服务器并手动运行挂接脚本 - 将最新文件签出到工作文件夹中。

我改变了钩子,所以除了回显信息之外,它什么都不做,我已经读过,我应该在推送后在控制台中看到它。但是这并没有显示出来,所以我只能假设这个钩子没有被解雇。

我推送HTTP服务器处理请求的服务器上的git dot aspx,并通过gui在本地进行注入。之后,我尝试了Bonobo,当通过gui或bash控制台进行推送时,钩子不起作用。

我假设有人有这个工作的地方,但经过两天寻找所有我找到的解决方案没有帮助或没有回答同样的问题的人。

(我是一个git新手btw)。

干杯。

更新

我开始认为这可能是做的权限 - 而Unix许可,而不是NTFS。当@eis提到我使用NTFS的权限时。但经过更多的挖掘,似乎Windows上的Git仍然检查Unix文件权限。

所以我怀疑这个问题是post-receive文件不可执行,因为当我做一个ls -o它是-rw-r-r--(我相信)。如果我尝试通过bash和chmod 777 post-receive进行更改,那么执行ls -o的权限是相同的。

奇怪的是,只要我编辑后接收(与记事本+ +)的执行位被删除。 (我的测试脚本以.bat结尾,虽然保留其执行位...)

顺便说一句,我登录的用户是文件的所有者(根据ls -o),但我不能设置权限。

现在开始变得非常困惑。我错过了真正明显的东西吗?

更新2

无论chmod 777 post-receive也不chmod a+x post-receive工作。我拿了一个新的干净的post-receive文件,将它上传到服务器并检查了权限并执行了。如果我在Windows中重命名该文件(以删除示例),则执行将被删除。如果我用bash与mv执行保留。 但是,无论何时编辑文件(在Windows中或在vi中使用bash),然后执行都会被删除。

所以,现在的问题是为什么当我编辑文件时删除了执行位?

希望这是最后一关,它不执行的原因...

+0

你确定你的脚本是正确的,它执行?你有没有在那里登录?怎么样git-dot-aspx,它有没有任何日志? – vissi 2012-02-23 15:38:13

+0

当我登录到服务器并通过bash控制台手动运行时,它按预期方式运行(即回显并签出一些文件)。这告诉我脚本很好。然而,当我推到这个回购它不开火 - 我没有看到回声和文件没有签出。这告诉我脚本没有被调用。 至于原木。事件查看器中没有任何内容,找不到任何gitdotaspx日志,Bonobo有日志但没有错误。 – Jag 2012-02-23 16:00:10

+0

它应该起作用,并且无论您使用哪个客户端都无关紧要。 你可以检查的几件事: - 脚本中的shebang行 - 它是否指向有意义的东西?脚本是否使用那里提到的shell? - 是否为脚本正确设置了执行权限,用户runnig git repo是否具有正确的权限? - 你的脚本结尾是否正确,对吗? (虽然你会看到一个关于这个的错误) – eis 2012-02-23 16:52:19

回答

1

你将需要修补的git,使这项工作。 builtin/receive-pack.c中的检查用于access(path, X_OK)。在msysgit中,这转向了mingw_access,它抛弃了X_OK位,因为它在Windows上很简单,不受支持。

在windows上,我们没有标志来指定文件是可执行文件。系统经常对此进行一些模拟。例如,tcl将在PATHEXT环境变量中查找任何扩展来决定文件是否可执行。我们不能这样做,因为钩子名称是没有任何扩展名的硬编码。

相反,我建议更改访问测试,只检查文件是否存在,然后在路径上调用execv。这个(在compat/mingw.c中)的mingw版本查找脚本文件,并将读取shbang行并启动适当的解释器(sh,perl等)。所以修改builtin/receive-pack.c:run_update_hook应该让你的工作。目前钩子运行使用start_command,我认为应该调用execv给你。

总之,改变访问测试,它可能会工作。

+0

感谢@patthoyts的信息,我现在正在下载源代码并且会看一看。虽然没有感到过于自信 - 我只是设法了解你在说什么。 (没有你的知识进攻,只是我的:) 我是否天真认为这应该是现成的?毕竟,如果钩子是Git的一个组成部分,那么git的解决方案肯定会支持这个? – Jag 2012-02-24 12:57:48

+0

只有当有人真的使它工作。我不认识任何其他人,但是当我在Windows上使用msysGit时,我在Linux上托管了所有我的中央存储库。任何Windows窗口都在开发工作站之间,并且从不需要任何钩子。如果你测试了这一点,它就可以工作,那么你可以提交补丁并为每个人解决这个问题。 – patthoyts 2012-02-24 14:54:51

+0

是的,我想在Git中依然存在很多对nix的依赖。我下载了源代码并查看了你的建议。它大部分是有道理的,但我没有足够的信心(并且没有时间)自己来解决它。我认为我会花时间在项目工作之间与Git进行一场比赛,但目前似乎有点过于努力。尽管答案是正确的,但我会相信你的答案。谢谢你的时间。 – Jag 2012-02-24 15:14:17

0

当在服务器上使用msysgit并通过文件共享挂钩时,现在可以毫无问题地工作。自从答案写完以后,这可能会在mysysgit中修复。我没有看着它。

我也注意到,原来的问题表明git dot aspx和Bonobo正在使用哪些使用GitSharp.dll。这将意味着应用程序不会对git.exe进行脱壳,并且挂钩将不会以相同的方式处理。

例如,GitSharp.dll在git的点ASPX使用有它自己的钩子后收到这可能在C#中进行挂钩实现:

public void Receive(Stream inputStream, Stream outputStream) 
{ 
    using (var repository = GetRepository()) 
    { 
     var pack = new ReceivePack(repository); 
     pack.setBiDirectionalPipe(false); 

     //setup post receive hook here 
     pack.setPostReceiveHook(new PostRecieveHook()); 

     pack.receive(inputStream, outputStream, outputStream); 
    } 
} 


public class PostRecieveHook : IPostReceiveHook 
{ 
    public void OnPostReceive(ReceivePack rp, ICollection<ReceiveCommand> commands) 
    { 
     //Do PostRecieve Hook Work Here 
    } 
} 

我希望能帮助别人与困惑是库之间Git的实现以及调用实际git.exe的应用程序。

+0

感谢您的更新。我会检查出来的。 (仍然没有得到这个解决:)) – Jag 2013-10-01 11:12:39

+0

关于它的任何消息?我也无法让它工作......:| – 2017-05-05 11:57:46

相关问题