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

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

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

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

Git

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

Q&A

解決済

2回答

1430閲覧

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

ryu_wtd.

総合スコア29

bash

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

Git

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

0グッド

0クリップ

投稿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のリファクタリング案を教えてほしい

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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となりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問