🔍

あるcommitが含まれるPullRequestをシェルから開く

2023/09/28に公開1

git logを見ていて「このcommitってどのPRのやつだっけ?」になることがままあります。

git log --graphでmerge commitを探したり、GitHubからそれっぽいPRを探すのも面倒なので「あるcommit hashを含むGitHubのPRをブラウザで開く」シェル関数をChatGPTに書いてもらいました。

findpr() {
    local pr_number=$(git log --merges --ancestry-path --oneline "$1"..main | tail -1 | awk '{print $5}' | cut -d# -f2)
    if [ -z "$pr_number" ]; then
        echo "PR番号が見つからんかったわ。"
        return 1
    fi

    local repo_url=$(git remote get-url origin | sed -E 's/^.+@github\.com/https:\/\/github.com/')
    if [ -z "$repo_url" ]; then
        echo "リポジトリのURLが取れんかったわ。"
        return 1
    fi

    open "${repo_url}/pull/${pr_number}"
}

これを~/.zshrcとかに書いておきます。あとは、

$ findpr b0600a8c

みたいにcommit hashを渡すと、その変更が含まれるPRがブラウザで開かれます。

gitリポジトリの探索はgit log -S {word}で検索したり、git blameでcommitを特定するだけでなく、PRを探したい場面も多いでしょう。

もしかしたら複雑なツリーをうまく追えない場面もあるかもしれませんが、私が日常使う分にはうまく動いてくれてるのでよかったら試してみてください。

Discussion

saxsirsaxsir

ちょこっとChatGPTに改修してもらって .gitconfigにaliasで書いてみたサンプル
(便利そうなので使ってみました共有です)

  • ブランチがmainでもmasterでも動くように修正
  • (私の環境だと?) git remote get-url origin の返り値に .git が入っていてURLがブラウザでうまく開けなかったので sed 's/\\.git$//' このあたりで置換
    • 期待としては https://github.com/saxsir/dotfiles/pull/23 こんな感じのURLになってほしいのだが、 https://github.com/saxsir/dotfiles.git/pull/23 を開こうとしてしまっていた
➜  dotfiles git:(master) ✗ git remote get-url origin
ssh://git@github.com/saxsir/dotfiles.git
[alias]
    findpr = "!f() { \
        local default_branch=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'); \
        local pr_number=$(git log --merges --ancestry-path --oneline \"$1\"..$default_branch | tail -1 | awk '{print $5}' | cut -d# -f2); \
        if [ -z \"$pr_number\" ]; then \
            echo \"PR番号が見つからんかったわ。\"; \
            return 1; \
        fi; \
        local repo_url=$(git remote get-url origin | sed -E 's/^.+@github\\.com/https:\\/\\/github.com/' | sed 's/\\.git$//'); \
        if [ -z \"$repo_url\" ]; then \
            echo \"リポジトリのURLが取れんかったわ。\"; \
            return 1; \
        fi; \
        open \"${repo_url}/pull/${pr_number}\"; \
    }; f"

$ git findpr {commit_hash} で動くはず。