はじめに
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を使いまくろうと思いました。