2
2

More than 5 years have passed since last update.

gitのmerge commitから、automergeが発生しているファイル一覧を出力2

Last updated at Posted at 2013-05-11

前回の改良版です。

いろいろとアドバイスを貰ったのでそれを元に修正しました。
地道に投稿し続けた甲斐がありました!
ありがとうございます。
使ってみようと思われた方はこちらからどうぞ!

せっかくなので、貰ったアドバイスを反映するために、勉強も兼ねて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

2
2
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
2
2