質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

解決済

hooksのpost-receiveが認識されない

ryu_wtd.
ryu_wtd.

総合スコア29

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

2回答

0グッド

0クリップ

228閲覧

投稿2022/11/18 10:04

編集2022/11/21 01:19

前提

https://teratail.com/questions/6h56qd5otf458l
先日、上記質問内で一度回答をいただいていますが具体的な実現方法で躓いています。

ブランチの運用モデルはGit Flowを想定しています。

同一サーバー上にあるもの
1. リモートリポジトリ(ベアリポジトリ)
2. リモートのdevelopブランチの状態を反映するノンベアリポジトリ
3. リモートのreleaseブランチの状態を反映するノンベアリポジトリ

1のhooks内のpost-receiveにbashをテキストファイル形式で記述し、実行権限を与えています。

Gitとファイルの操作はSourcetree及びGit bashで行っています。

GitHubなどのホスティングサービスは利用せず、社内のレンタルサーバーにリポジトリを置いています。

bashについては数日前に触り始めたばかりです。

実現したいこと

  • ローカルからリモートのdevelopブランチへのプッシュがあった時は 2 が自動的にdevelopブランチをプルし、releaseブランチへのプッシュがあった時には 3 が自動的にreleaseブランチをプルするように設定したい。
  • そもそもローカルからプッシュを行う際にリモートのpost-receiveを認識していないようのでそれを解消したい。

発生しているメッセージ

sourcetree内で常にすべての出力をコンソールに表示する状態にしたうえでdevelopブランチに対してプッシュを行うと下記メッセージが表示され、プッシュ自体には成功しますがpost-receiveに記述した処理が実行されずdevelop内のワーキングディレクトリは空のまま。

git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v --tags origin develop:develop Pushing to ssh://sample.jp/home/test/rmt_repo.git fatal: cannot run hooks/post-receive: No such file or directory To ssh://sample.jp/home/test/rmt_repo.git e4df17f..bf5c640 develop -> develop updating local tracking ref 'refs/remotes/origin/develop'

該当のソースコード

以下post-receive内の記述

bash

1#!/bin/bash 2 3#繰り返し処理内で戻るために実行時の最初の場所を記憶 4cwd=$(pwd) 5#参考サイトより複数ブランチへプッシュがあった場合のために標準入力を1行ずつ読み込む 6while read oldrev newrev refname; do 7  #ブランチ名を特定し、それによって条件分岐させる 8 branch=$(git rev-parse --symbolic --abbrev-ref $refname) 9 if [ "$branch" = "develop" ]; then 10 cd /home/test/develop/ 11 git --git-dir=.git pull origin develop 12 cd "$cwd" 13 elif [ "$branch" = "release" ]; then 14 cd /home/test/release/ 15 git --git-dir=.git pull origin release 16 cd "$cwd" 17 fi 18done

コピーペーストではなくvimを用いて全て手打ちで入力していますが、
参考サイト内のものを丸々転用した部分もあるのでコードの意味を完全に理解しているわけではなくめちゃくちゃなことを書いている可能性があります。
参考:https://songmu.jp/riji/entry/2014-08-07-post-receive-branch.html

試したこと

リモートリポジトリのhooks内から

./post-receive

で直接実行しようとしても

./post-receive: Command not found.

と表示されます。

聞きたい事

  • なぜpost-receiveが認識・実行されないのか
  • post-receive内のbashの文法は正しいか
  • 社内用のマニュアルで公開するためpost-receiveのリファクタリング案を教えてほしい

非常に知識が浅い状態で、上記内容を実現しようとしているため間違っている箇所が多々あることが予想されますが、ぜひご教授お願い致します。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

自己解決

shebangを”#!/bin/bash”から”#!/bin/sh”に書き換えると正常にコマンドが認識されるようになりました。
なぜ"#!/bin/bash"では読み込まれないのかはわからないままですが、一旦問題は解決しました。

投稿2022/11/28 03:50

ryu_wtd.

総合スコア29

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

なぜpost-receiveが認識・実行されないのか

カレントディレクトリが別の場所ってことはないでしょうか

投稿2022/11/18 10:51

y_waiwai

総合スコア86072

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

ryu_wtd.

2022/11/21 02:21

ご回答ありがとうございます。 カレントディレクトリが別の場所というのはつまり、post-receive内に記述したパスに誤りがあるということでしょうか。
y_waiwai

2022/11/21 02:27 編集

./post-receive というのは、カレントディレクトリにある post-receive を指しています これが見つからないってことは、そこにはなく、別の場所にあるということになります あるいは、カレントディレクトリが別の場所だった、ってことですね
ryu_wtd.

2022/11/21 03:07

post-receiveがあるディレクトリに移動し、"vi post-receive"でpost-receiveのソースコードを呼び出したところ、質問文中のソースコードがbashに表示されました。そのまま":q"で終了し、"./post-receive"を実行しても"command not found"となりました。この場合でもご指摘いただいた内容に当てはまる可能性はあるでしょうか。
y_waiwai

2022/11/21 04:00

ああ、シェルスクリプトなら、ファイル名は post-receive.sh でしょう 名前をそのようにリネームして、./post-receive.sh で実行してみましょう
ryu_wtd.

2022/11/21 04:27

post-receive.shにリネームし、FTPソフトから実行ファイルに変わっていることを確認してから./post-receive.shを実行してもCommand not foundとなりました。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。