git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: error: cannot run hooks/pre-receive: No such file or directory

From
Mathieu Malaterre <mathieu.malaterre@gmail.com>
Date
Mar 31, 2011, 07:20 UTC
Message-ID
<AANLkTikb42kG8DyZ7KHhin+=1X72XvN9p-mjed0oJsk=@mail.gmail.com>
In-Reply-To
<20110330200442.GA30663@sigill.intra.peff.net>
On Wed, Mar 30, 2011 at 10:04 PM, Jeff King <peff@peff.net> wrote:
Show 31 quoted lines
> On Wed, Mar 30, 2011 at 03:27:14PM +0200, Mathieu Malaterre wrote:
>
>> $ git push
>> Counting objects: 5, done.
>> Delta compression using up to 4 threads.
>> Compressing objects: 100% (3/3), done.
>> Writing objects: 100% (3/3), 304 bytes, done.
>> Total 3 (delta 2), reused 0 (delta 0)
>> error: cannot run hooks/pre-receive: No such file or directory
>> To ssh://malat@gdcm.git.sourceforge.net/gitroot/gdcm/gdcm.old
>>  ! [remote rejected] master -> master (pre-receive hook declined)
>> error: failed to push some refs to
>> 'ssh://malat@gdcm.git.sourceforge.net/gitroot/gdcm/gdcm.old'
>
> We won't try to execute a hook that doesn't exist, so the "no such file
> or directory" almost certainly means the #! interpreter is missing.
>
>> I tried with something as simple as :
>>
>> % cat pre-receive
>> #!/usr/bin/ruby
>> % which ruby
>> /usr/bin/ruby
>
> This might be a stupid question, but which machine is that output from?
> The pre-receive hook runs on the server, so you must have ruby there. I
> ask mainly because I didn't realize sourceforge would give people
> arbitrary shell access on the git boxes.
>
> My next guess would be that the git process runs in some kind of chroot
> that doesn't have ruby in it.

Makes complete sense now. I thought initially that the "no such file" refered to the actual hooks script. I naively assumed my ssh connection on sf.net gave me access to the actual git boxes (or maybe it is executed from a chroot).

In any case rewriting the script in pure shell script (no bash either) seems to work ok now (*).

However I am now being told that this script should rather go in the update hooks...

(*) read rev_old rev_new refname

ref_to_check="refs/heads/master"
if [ "$refname" == "$ref_to_check" ]
then
  merge_bases=`git merge-base ${rev_old} ${rev_new}`
  if [ "$merge_bases" != "$rev_old" ]
  then
    echo "Non fastward is disallowed"
    exit 1
  fi
  # non-fast-forward case:
  git rev-list --parents $merge_bases..$rev_new \
    | while read x; do
      set -- $x
      if [ "$#" != "2" ]
      then
        echo "Multiple parents: $x";
        exit 1
      fi;
    done
  [ $? -ne 0 ] && exit 1
fi
exit 0
Previous: Jeff King
Message 4 of 4 in “error: cannot run hooks/pre-receive: No such file or directory”
  1. Mathieu MalaterreMar 30, 2011
  2. Computer DruidMar 30, 2011
  3. Jeff KingMar 30, 2011
  4. Mathieu MalaterreMar 31, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.