はじめに
GitHubで何かプロジェクトをフォークして、自リポジトリで修正した後、プルリクで本家プロジェクトにフィードバックする、というワークフローはよくある話だと思います。
よくある困ったこととして、フォーク元の更新が早いと、修正した内容が問題無いか確認が必要だったり、別途調整が必要など、色々と頭が痛い問題があります。
ここではエイリアスを駆使してフォーク元の更新に同期しつつ、修正を完遂したいユースケースについてメモを残しておきます。
フォーク元の変更をフォーク先のリポジトリに同期する
フォーク元の変更をフォーク先のリポジトリに同期するするには下記のコマンドを実行する必要があります。
gh repo sync フォーク先のリポジトリ名
これでリモートリポジトリ(フォーク先のリポジトリ)を最新の状態に更新することができますが、当該リポジトリ(フォーク先のリポジトリ)の作業している時、リモートリポジトリというのは、ローカルリポジトリで作業している場合では自明です。
自明ですが、gh
コマンドはローカルリポジトリとは無関係で稼動することが要求されるコマンドです。明示的にリポジトリ名を指定する必要があります。
そこでローカルリポジトリの作業中、git
側のフローと連動させることで、この辺りの省力化を図ります。
というわけで現在作業しているリポジトリ(ワークスペース)のリポジトリ名を取得します。
gh repo set-default --view
これで取得できれば(=GitHubからクローンしていれば)、下記のようにして同期、つまり最新の状態に更新できます。
gh repo sync $(gh repo set-default --view)
ここまでできれば git pull
すれば最新の更新をワークスペースに取り込めることになります。
あとはワークフローに乗せるだけですね。下記のようにエイリアスを定義すれば、git pull
前に git sync
してしまえば良いことになります。
git config --global alias.sync '!gh repo sync $(gh repo set-default --view)'
よくある質問とその答え
Q.gh repo sync
じゃダメなのですか?
A.リモートリポジトリをローカルリポジトリに同期するだけです。git pull
にほぼ等しい振る舞いになります。
Q.用語が分からん。関係性込みで説明してくれ。
A.ワークスペース・インデックス・ローカルリポジトリ・リモートリポジトリまでであればGitの範疇の用語となります。こちらについては参考文献を参照してください。とりあえずGitとは何か…を知っている前提でこの辺りの話を省略します。
厳密には更に、GitHubとは何か…を知っている必要があります。ここではGitとGitHubの接点がどうなってるかを注視して説明します。
GitHubではリモートリポジトリをホスティングしてくれるサービスです。
GitHubは、別のリポジトリからフォークして、自分のリモートリポジトリとして取り扱う事ができるサービスを提供しています。
GitHubでは、別のリポジトリからフォークする、その元となるリポジトリをアップストリーム(upstream
)と位置付けています。
もちろんその関係性も含めてGitで取り扱う事ができなくもないです(あります)が、GitHubが自身が用意されてる機能を使用することで、管理が容易になります。
ワークスペース→(git add
)→インデックス→(git commit
)→ローカルリポジトリ→(git push
)→リモートリポジトリ→(gh pr
)→アップストリーム
リモートリポジトリまではGitの取り扱い範疇ですが、リモートリポジトリから先はGitHubの取り扱い範疇となります。
その辺りの用語説明無しに解説されている話ではありますが、リモートリポジトリ・アップストリームを「フォーク先のリポジトリ」・「フォーク元のリポジトリ」としてGitHub側の立場になって見る必要があります。
参考文献
gh repo sync
については色々と解説を見て参考にもなるのですが、この核心に触れる解説を見つけられなかったので、マニュアルのみリンクします。