Git 从本地存储库推送到远程存储库后,Hook post receive不起作用

Git 从本地存储库推送到远程存储库后,Hook post receive不起作用,git,localhost,remote-server,githooks,git-post-receive,Git,Localhost,Remote Server,Githooks,Git Post Receive,问题描述: #!/bin/sh git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f [alias] run = "!sh ./hook.sh" 我在git存储库中自动启动post receivehook时遇到问题。 从本地推送到远程存储库之后,hookpost-receive就不会执行了 我所做的步骤: #!/bin/sh gi

问题描述:

#!/bin/sh
git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f

[alias]
    run = "!sh ./hook.sh"
我在git存储库中自动启动
post receive
hook时遇到问题。 从本地推送到远程存储库之后,hook
post-receive
就不会执行了


我所做的步骤:

#!/bin/sh
git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f

[alias]
    run = "!sh ./hook.sh"
  • 我在本地计算机上创建(
    非裸
    )存储库并创建多个提交
  • 我在远程机器上创建一个存储库(
    bare
    ),在那里创建一个
    post-receive
    钩子,并将其设置为chmod为755
  • 在本地机器上,我添加了一个远程存储库(git remote add…)
  • 我做了一个正确运行的推力
  • 不幸的是,胡克没有开火

  • 我的环境:

    #!/bin/sh
    git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
    
    
    [alias]
        run = "!sh ./hook.sh"
    
    • 本地计算机:
      git2.25.0.windows.1
      @
      Win10(1909)
    • 远程计算机:
      git2.25.0
      @
      Debian 8.11(杰西)

    远程计算机上接收后文件的内容:

    #!/bin/sh
    git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
    
    
    [alias]
        run = "!sh ./hook.sh"
    
    • 注意:当我直接从ssh控制台运行此代码时,它工作正常

    其他SO解决方案?:

    #!/bin/sh
    git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
    
    
    [alias]
        run = "!sh ./hook.sh"
    
    是的,我见过很多,但没有一个能解决我的问题。
    我已经看到了一些关于“unset GIT_DIR”建议的答案,但我担心这与此无关,因为即使是
    echo test>log.txt
    post receive
    中也不起作用。似乎无法启动后接收?

    好的,我发现了问题所在-主机上的分区装载为
    noexec
    。如果是这样,挂钩就不能工作

    这是出于安全考虑。这是共享主机上的典型情况


    我的替代解决方案: 我们可以创建一个git别名,您可以在其中使用ssh日志运行bash脚本,并直接在服务器上运行git命令

    怎么做? 在本地存储库配置文件中,我们添加了一个别名:

    #!/bin/sh
    git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
    
    
    [alias]
        run = "!sh ./hook.sh"
    
    (如示例中所示,此别名将启动hook.sh文件)

    现在我们使用git命令创建一个hook.sh文件

    #!/bin/bash
    
    ssh user@host -p [port] 'bash -s' <<-EOF
        git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
        exit
    EOF
    
    
    #/bin/bash
    
    sshuser@host-p[port]'bash-s'好的,我发现了问题所在-主机上的分区装载为
    noexec
    。如果是这样,挂钩就不能工作

    这是出于安全考虑。这是共享主机上的典型情况


    我的替代解决方案: 我们可以创建一个git别名,您可以在其中使用ssh日志运行bash脚本,并直接在服务器上运行git命令

    怎么做? 在本地存储库配置文件中,我们添加了一个别名:

    #!/bin/sh
    git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
    
    
    [alias]
        run = "!sh ./hook.sh"
    
    (如示例中所示,此别名将启动hook.sh文件)

    现在我们使用git命令创建一个hook.sh文件

    #!/bin/bash
    
    ssh user@host -p [port] 'bash -s' <<-EOF
        git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
        exit
    EOF
    
    
    #/bin/bash
    
    sshuser@host-p[port]“bash-s”是
    /home/xxxxxx/xxxxxx/dev.git/hooks/post receive
    中的钩子?是的,当然,它是对的。您在那里设置了
    核心。钩子span
    ?您是指远程服务器上的设置,对吗?还没定下来。现在我尝试将其设置为
    core.hookspath=/home/xxxxxx/xxxxxx/dev.git/hooks
    。不幸的是,
    /home/xxxxxx/xxxxxx/dev.git/hooks/post receive
    中的钩子没有任何变化?是的,当然,它是正确的。您是否设置了
    核心。钩子?您是指远程服务器上的设置,对吗?还没定下来。现在我尝试将其设置为
    core.hookspath=/home/xxxxxx/xxxxxx/dev.git/hooks
    。不幸的是,一切都没有改变