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