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

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

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

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

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

Q&A

解決済

1回答

340閲覧

[SourceTree]pushするリソースを取得する方法

fukkun0412

総合スコア37

SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

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

0グッド

0クリップ

投稿2019/02/13 07:58

編集2019/02/15 01:28

質問内容

Gitのhooksでpushするリソースの情報を取得して特定のリソースの時に
hook(hookはpre-pushを使用)を動かしたい。
↓この質問に関連する質問
https://teratail.com/questions/170203
OSはWindows10 Pro

知りたいこと

hook内で、pushするリソースの情報(ここではpushされたcommitに含まれるファイル名)を取得する方法。
また自分の要望を実装できるのがクライアント側のhookであるか、サーバー側のhookであるのかがわからないので、知りたい。

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

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

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

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

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

firedfly

2019/02/14 04:02 編集

ご自分で調査された内容、試した内容を書いて頂けると幸いです。 欲しいリソースの情報がファイル名なのか、ファイル内容なのか、 はたまた別の属性なのかがわからないです。 あと「クライアント側であるのかサーバ側であるのか」というのが、ちょっとわかりません。
fukkun0412

2019/02/14 07:31

>欲しいリソースの情報がファイル名なのか、ファイル内容なのか、はたまた別の属性なのかがわからないです。 欲しい情報はリソース名になります。 >あと「クライアント側であるのかサーバ側であるのか」というのが、ちょっとわかりません。 すみません。こちらは以下のようになります。 クライアント側:pre-pushやpost-commitなどのクライアント側のhookのこと サーバ側:post-updateやpre-updateなどのサーバ側のhookのこと
firedfly

2019/02/14 23:48

こちらは「質問への追記・修正の依頼」なので、質問本文を修正して頂けると 私以外の質問者の目にも留まりやすくなります。 pushされたcommitに含まれるファイル名と 「クライアント側のhookであるか、サーバー側のhookであるのか」を知りたい、でしょうか。 それとも「クライアント側のhook」でやるべきか「サーバー側のhook」でやるべきかも教えて欲しい、という意味合いでしょうか。
guest

回答1

0

ベストアンサー

git diff HEAD..origin/masterで未プッシュのコミット内容を取得できます。
これはhookの知識ではなくgitコマンドの知識なので、留意して調べるとよいです。

以下、クライアント側・サーバー側のpre-pushで動作を確認しました。

sh

1#!/bin/bash 2 3# 検出対象のファイル名や拡張子 4target_file=.xml 5 6# 検出対象のリモート・ブランチ(git remote, git branch で取得可能) 7target_remote=origin/master 8 9 10# 要素が含まれているかチェックする関数 11containsElement () { 12 local e 13 for e in "${@:2}"; do [[ "$1" =~ $e ]] && return 0; done 14 return 1 15} 16 17 18echo "[INFO] Receiving the current push as `whoami`." 19 20# 標準入力を1行ずつ読み込み 21while read local_ref local_sha remote_ref remote_sha 22do 23 echo "[INFO] > Local Ref: $local_ref" 24 echo "[INFO] > Local sha: $local_sha" 25 echo "[INFO] > Remote Ref: $remote_ref" 26 echo "[INFO] > Remote sha: $remote_sha" 27 28 for FILE in `git diff HEAD..$target_remote`; do 29 if containsElement $FILE "$target_file"; then 30 echo "$FILE" 31 CHANGE_DETECTED=1 32 fi 33 done 34done < "${ST:-/dev/stdin}" 35 36if [ "$CHANGE_DETECTED" ]; then 37 echo "対象ファイルが含まれています。" 38 exit 1 39fi 40 41exit 1 # わざと失敗させて何度も試す用(0を返さない限りpushは失敗)

参考:かゆいところに手が届くgitフックスクリプト | UNITRUST

条件に応じてpushを阻止したいわけではなく、push後に1回だけ実行したい内容なので
サーバー側のpost-receiveで実行するのが正しいとは思います。

投稿2019/02/15 01:02

firedfly

総合スコア1131

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

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

fukkun0412

2019/02/15 10:19

firedflyさん、ご回答ありがとうございます。 上記のコードでorigin/masterの箇所をdevelopにしたい場合は origin/developと変更すればよろしいでしょうか?
firedfly

2019/02/15 20:31

よいです。 ただ、そういう試せばわかることは じぶんで試す習慣をつけるといいですよ。 (テスト用のリポジトリを作れば簡単です)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問