前回の改良版です。
いろいろとアドバイスを貰ったのでそれを元に修正しました。
地道に投稿し続けた甲斐がありました!
ありがとうございます。
使ってみようと思われた方はこちらからどうぞ!
せっかくなので、貰ったアドバイスを反映するために、勉強も兼ねて2つ作ってみました。
改良版1 linuxっぽい書き方に
改良点
- 多重起動を考慮し中間ファイルにユニークな名前を設定
- 処理終了時に中間ファイルを削除
- 空ファイルの作り方
- パイプの有効活用
ユニークな名前を設定するために、mktempを使うといいともきいたのですが、入っていない環境もあるとのことだったので、今回は利用を見送りました。
改良版2 中間ファイルを使わないようにする方法
改良点
- 中間ファイルを作成しないよう修正
- (改良版1のいいところを取り込み)
改良版1
# ! /bin/bash
# 引数としてコミットの ハッシュ HEAD HEAD^ 等のmergeコミットを一つ入力
# automergeが起きたファイルを全て表示
# 入力されたコミットの親の数を確認
PearentNum=$(echo $(git log $1 -1 --pretty=format:"%P" | wc -w))
# 中間ファイル名の設定
TEMP_DIR="/tmp/merged.$$"
mkdir -p $TEMP_DIR
TEMP_MERGED="$TEMP_DIR/merged.$$"
TEMP_AUTOMERGED="$TEMP_DIR/automerged.$$"
# 終了時に中間ファイルを削除するよう設定
trap 'rm -r ${TEMP_DIR}' 0
# merge commitかチェック
if [ $PearentNum -gt 1 ] ; then
#親が2以上(merge commitの場合)
#入力されたコミットとその親との差分が存在するファイル名からmergeが行われたファイルを列挙
#同名ファイルが万が一存在した時のために $TEMP_MERGED を初期化
cp /dev/null $TEMP_MERGED
#親の数だけループ
i=1
for Pearent in $(git log $1 -1 --pretty=format:"%P")
do
#一応親のハッシュを出力しておく
echo "Pearent $i : $Pearent"
git diff --name-only $1 $Pearent >> $TEMP_MERGED
i=$(expr $i + 1)
done
#mergeされたファイルをソートし、重複ファイルを抽出
sort $TEMP_MERGED | uniq --repeated > $TEMP_AUTOMERGED
#重複しているファイルがあれば出力
if [ -s $TEMP_AUTOMERGED ] ; then
echo " *automerged file name"
cat $TEMP_AUTOMERGED
else
echo "no automerge"
fi
else
#親が2以上いないなら入力されたハッシュを出力して処理を終了
echo "$(git log $1 -1 --pretty=format:"%H") is not Merge Commit"
fi
改良版2
# ! /bin/bash
# 引数としてコミットの ハッシュ HEAD HEAD^ 等のmergeコミットを一つ入力
# automergeが起きたファイルを全て表示
# 入力されたコミットの親の数を確認
PearentNum=$(echo $(git log $1 -1 --pretty=format:"%P" | wc -w))
# merge commitかチェック
if [ $PearentNum -gt 1 ] ; then
#親が2以上(merge commitの場合)
#入力されたコミットとその親との差分が存在するファイル名からmergeが行われたファイルを列挙
#マージが行われたファイル名一覧用変数の初期化
MergedFiles=""
#親の数だけループ
i=1
for Pearent in $(git log $1 -1 --pretty=format:"%P")
do
#一応親のハッシュを出力しておく
echo "Pearent $i : $Pearent"
MergedFiles=$(echo -e "$(git diff --name-only $1 $Pearent)\n${MergedFiles}")
i=$(expr $i + 1)
done
#空行削除後、mergeされたファイル名をソートし、重複ファイルを抽出
AutoMerged=$(echo "$MergedFiles" | grep -v "^$" | sort | uniq --repeated)
#重複しているファイルがあれば出力
if [ -n "$AutoMerged" ] ; then
echo " *AutoMerged filenames..."
echo "$AutoMerged"
else
echo "no automerge"
fi
else
#親が2以上いないなら入力されたハッシュを出力して処理を終了
echo "$(git log $1 -1 --pretty=format:"%H") is not Merge Commit"
fi