Git、ベアリポジトリ作成エラー「post-receive: No such file or directory」の切り分けと解決方法

ローカルや、自前・クラウド環境で自らgitサーバを構築するなどしたときに、
リモートリポジトリを作成するかと思います。

その際、自動でデプロイするようにhooks内でスクリプトを記述します。
ベアリポジトリのフック内でpost-receiveを追加する方法は
多くのサイトで紹介されています。

その通りに行った後、ローカルからpushしたときに
post-receiveで下記のようなエラーが表示されました。

remote: error: cannot run hooks/post-receive: No such file or directory

まるで、ファイルが見つからないような内容です。
意外と沼にハマったので備忘録として残します。
同様のエラーで進まない方は、ぜひご参考に。

現状の構成

まず、リモートリポジトリについてです。
私は、LinuxベースのOSです。

ベアリポジトリ

/volume1/git/AAA.git
にベアリポジトリを作成しました。

hooksにpost-receive.sampleが存在しなかったため、
手動で作成しました。

#!/bin/sh
cd /volume1/web/AAA
git --git-dir=.git pull

なお、スクリプト内の2行目は、ノンベアリポジトリを指定しています。

ノンベアリポジトリ

/volume1/web/AAA
にノンベアリポジトリを作成しました。

この中で、gitを構成した後
git remote add origin /volume1/git/AAA.gitとコマンド実行しています。

この状態で上記のような
ファイルが見つからないというエラーが表示されてます。

試したこと

なお、網羅的に試していないので
下記のいずれかを見直さないと直らない場合があります。

①ファイルのアクセス権限を見直した。

ファイルに対して、chmodコマンドを実行して実行権限を付与しました。

=>変わらず。

②ファイルの作成方法を変えた。

cuiでviエディタにより作成。
=>変わらず。
guiでファイルを作成
=>変わらず。

③インタープリタの変更

実際は、どちらもbashなのですが、
shは、シンボリックリンクであるため、試してみます。
shだと使用できないコマンドもあるそうです。

#!/bin/sh

から

#!/bin/bash

に変更をしました。
=>変わらず。

④シェルスクリプトから直接実行してみる。

sshかリモート先のコンソール等から、bashを直接起動します。
which bashでパスを確認します。

そもそも、スクリプトに記述するパスと異なっていれば、
シバン(shebang)で実行できませんね。

では、post-receive内の記述を順に実行します。
cd /volume1/web/AAA
=>実行できた。

git –git-dir=.git pull
=>エラー

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull  

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/ master

ここで記述ミスしていることを知りました。
ブランチが複数あったので指定をしてあげました。

git –git-dir=.git pull origin main

bashでは、うまく動作しました。

 

より、不可解ですね。

⑤post-receive内の記述をコピペせず入力

いよいよ、ファイル内の記述がおかしいと言うところまで来ました。

今まで、post-receive内の記述をコピペしていました。
最近のbashは便利なものでコピペできてしまいます。

Webで参考記述が無限にあるのでザザッとコピペしていましたが、
その記述を手入力してみました。

そして、ローカルからpush してみると、
サッッ

うまくいきました。

文字コードなんですかね。

海外のフォーラムには、エラー原因は文字コードとの記載もあり、
最初に疑っていたため
ファイル作成を意識していましたが。

コピペが原因とは。もっと早く試していれば。。。

おわりに

コピペは、事務界隈では必須スキルです。
ミスを減らし、効率的に業務を遂行できますが、
文字コードとかになると話は異なりますね。。。。

最近は、スタイルもコピペできるので、
エンジニアやクリエイターは、時と場合によって使い分けなくてはなりませんね。

ありがとうございました。

追記 2022.0623

なんだかんだ、#!/bin/bash#! bin/bashと書いてしまったかもしれない。

コメント

スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました