0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

commit時に含まれて欲しくない文字列を検査して入っていたらコミットさせない方法(git hook)

Last updated at Posted at 2023-01-12

はじめに

config.ini等の設定ファイルに保存された値(パス等)でコミットしたくないものを誤ってコミットする前に気づけたらいいなと思って作りました。

環境

Windows 11
Powershell 5.1

手順

※以下の手順はすべて仮想環境上で行っています

mkdir pre_commit_test
cd pre_commti_test
python -m venv .venv
.\.venv\Scripts\activate
git init

1. pre-commitファイルの作成

new-item .git/hooks/pre-commit 
.git/hooks/pre-commit
#!/bin/bash

# 1. git addされたファイルを取得
added_files=$(git diff --name-only --cached)

# 2. config.iniからkey=valueのvalueの値を取得
target_value=$(grep '=' config.ini | awk -F'=' '{ print $2 }')

# 3. 1で取得したファイル内のコードから2で取得した値と一致する値を表示する
exit_code=0
for file in $added_files; do
    for v in $target_value; do
        
        row_nums=$(grep -n $v $file | awk -F ':' '{ print $1}')
        
        if [ "$row_nums" ]; then
            # git add されたファイル内にconfig.iniで定義された値が存在している=エラー
            exit_code=1
            echo "- should not exist value: $v"
        fi
        for row_num in $row_nums; do
            echo "row: ${row_num}"
        done

    done
done

if [ $exit_code = 1 ]; then
    echo -n -e "\n"
    echo "- status     : Check information that should not exist ..... Failed"
    echo "- description: Checks if there is information that should not be present in the file"
    echo "- exit code  : ${exit_code}"
    echo -n -e "\n"
    echo "File has been refused commit to this hook"
else
    echo "- status     : Check information that should not exist ..... Passed"
    echo "- exit code  : ${exit_code}"
fi

exit $exit_code

2. config.ini 作成

config.ini
[Test1]
key1=string1
key2=string2
key3=string3

[Test2]
key4=string4

3. sample.py 作成

sample.py
"test"
"test"
"test"
"string1"

4. コミットする

git add sample.py
git commit -m "pre-commit test sample.py"

結果

- should not exist value: string1
row: 4

- status     : Check information that should not exist ..... Failed
- description: Checks if there is information that should not be present in the file
- exit code  : 1

File has been refused commit to this hook

"string1"という文字列が4行目に存在するのでコミットができなくなっている

なので、エラー文字列をsample.pyから削除して再コミットしてみる

sample.py
"test"
"test"
"test"

↓再実行結果 無事コミットされている。

- status     : Check information that should not exist ..... Passed
- exit code  : 0
[master (root-commit) 0dba68e] pre-commit test sample.py
 1 file changed, 1 insertion(+)
 create mode 100644 sample.py

おわりに

シェルスクリプトは書き慣れていなかったのですが、chatGPTで調べたらめちゃくちゃいい感じのコマンドが出力されたのでそれをうまいこと使って作りました。
それでも、あまりきれいな感じではないですが、、
単純なスクリプトを考えるときはchatGPTを使いまくろうと思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?