Open2

Git Tips

Fujiya228Fujiya228

特定フォルダのコミット一覧

git log --format="%H" -- path/to/target

ファイルに出力

git log --format="%H" -- path/to/target > commits.txt
Fujiya228Fujiya228

特定コミットのPR一覧を洗い出し

#!/bin/bash

# 読み込むファイル名(改行区切りでコミットハッシュが書かれているファイル)
COMMIT_FILE="commits.txt"
REPO="owner/repo"
OUTPUT_FILE="pr_numbers.txt"
PROCESSED_COMMITS_FILE=$(mktemp)  # 一時ファイルで処理済みコミットを管理
SLEEP_INTERVAL=5  # レートリミット対策用のスリープ時間(秒)
> "$OUTPUT_FILE" # 出力ファイルを初期化

# 処理済みコミットを保存する関数
mark_commit_processed() {
    local commit=$1
    echo "$commit" >> "$PROCESSED_COMMITS_FILE"
}

# コミットが処理済みかチェックする関数
is_commit_processed() {
    local commit=$1
    grep -q "^$commit$" "$PROCESSED_COMMITS_FILE"
}

# PRを検索し、PR番号と関連するコミットを取得する関数
get_pr_for_commit() {
    local commit_hash=$1
    
    # PRを検索し、PR番号を取得
    pr_number=$(gh api -X GET /search/issues -F "q=repo:$REPO $commit_hash" | jq -r '.items[0].number')
    
    # PR番号が取得できた場合のみ処理を進める
    if [ -n "$pr_number" ]; then
        # PRに含まれるコミットを取得
        commit_hashes=$(gh api -X GET "/repos/$REPO/pulls/$pr_number/commits" | jq -r '.[].sha')
        
        # PR番号を出力ファイルに追記
        echo "$pr_number" >> "$OUTPUT_FILE"
        echo "Commit $commit_hash -> PR $pr_number (Saved to $OUTPUT_FILE)"
        
        # PRに含まれるすべてのコミットを処理済みに記録
        for commit in $commit_hashes; do
            mark_commit_processed "$commit"
        done
    else
        echo "Commit $commit_hash -> No PR found"
    fi

    # レートリミット対策でスリープ
    sleep "$SLEEP_INTERVAL"
}

# ファイルの各行(コミットハッシュ)をループで処理
while IFS= read -r commit_hash; do
    # すでに取得済みのコミットであればスキップ
    if is_commit_processed "$commit_hash"; then
        echo "Commit $commit_hash is already processed, skipping."
        continue
    fi

    echo "Searching for PR related to commit: $commit_hash"
    get_pr_for_commit "$commit_hash"

done < "$COMMIT_FILE"

# 後処理: 一時ファイルの削除
rm "$PROCESSED_COMMITS_FILE"
echo "PR numbers saved to $OUTPUT_FILE"