【ITニュース解説】Raising PR to Another Repository
2025年09月21日に「Dev.to」が公開したITニュース「Raising PR to Another Repository」について初心者にもわかりやすく解説しています。
ITニュース概要
他の開発者が作ったツールに「最近更新されたファイルだけを抽出する」新機能を実装。リポジトリをフォーク後、誤ってGit管理されていたファイルを修正した。ファイル変更日はGit履歴から正確に取得。プルリクエスト提出やレビューを通じ、他者の開発スタイル理解、品質維持、そしてオープンソース開発における協力の重要性を学んだ。
ITニュース解説
ある開発者が、システムエンジニアを目指す初心者にも役立つような、オープンソースプロジェクトへの貢献経験について語った。これは、他の人のプロジェクトに新しい機能を追加するという課題に取り組んだ話である。具体的には、「Repository-Context-Packager」という、Gitリポジトリを分析し、その内容を一つのファイルにまとめるコマンドラインツールに貢献した。このツールはJavaScriptというプログラミング言語とNode.jsという実行環境で作られている。
プロジェクトへの貢献を始めるにあたり、最初に行ったのは「フォーク」と呼ばれる作業だった。これは、貢献したいプロジェクトのコード一式を自分のGitHubアカウントにコピーすることである。オリジナルのプロジェクトには直接変更を加えて保存(プッシュ)する権限がないため、自分のコピーを作成してから作業を始めるのが一般的だ。
フォークしてプロジェクトの準備(セットアップ)を進めていると、すぐに一つの問題点に気がついた。通常、プロジェクトで使う外部のプログラムや部品(これらをまとめてnode_modulesというフォルダに保存する)は、Gitというバージョン管理システムで追跡されないように設定する。これは、node_modulesが非常に多くのファイルを含み、プロジェクトのサイズを不必要に大きくしてしまうためだ。Gitに何を追跡しないかを指示するファイルが.gitignoreだが、このプロジェクトではnode_modulesが.gitignoreに記載されているにもかかわらず、Gitがそれを追跡してしまっていた。
この問題の原因は、node_modulesフォルダやその中のファイルが、まだ.gitignoreファイルが存在しないか、あるいはその内容が適用される前に、誤ってGitの追跡対象として登録されてしまっていたことだった。Gitは一度追跡を始めたファイルを、後から.gitignoreに追加しても自動的には追跡を止めないという特性がある。この状況を解決するため、開発者はgit rm --cachedという特別なコマンドを使った。このコマンドは、Gitの追跡リストからファイルを削除するが、実際にローカルのコンピュータにあるファイル自体は消さないという便利な働きをする。この修正作業を終え、その変更を元のプロジェクトに提案する「プルリクエスト」を提出した。これは、単なるバグ修正の貢献だったが、プロジェクトへの最初のステップとして非常に重要だった。
最初の問題を解決した後、開発者は本来の目的である新しい機能の開発に取りかかった。追加する機能は、--recentという新しい「フラグ」を追加するというものだ。このフラグを使うと、指定した日数以内に変更されたファイルだけを絞り込み、それらをまとめてパッケージングできるようになる。例えば、--recent 7とコマンドを入力すれば、過去7日以内に更新されたファイルだけが対象になる、といった具合だ。
この機能の実装には、技術的な課題があった。それは、ファイルの「変更日時」をどのように正確に取得するかという点である。当初、開発者はファイルシステムの機能を使ってファイルの最終更新日時を取得することを検討した。しかし、これにはいくつかの問題があった。ファイルシステムの変更日時は、オペレーティングシステムによって扱われ方が異なる場合があり、必ずしも信頼できる情報とは限らない。さらに、このツールはGitリポジトリを対象としているため、Gitが管理している変更履歴を直接参照する方がより適切だと判断された。そこで、JavaScriptからGitコマンドを実行するためのsimple-gitというライブラリを利用し、Gitのコミット履歴(いつ、誰が、どのファイルを変更したかという記録)に基づいて変更日時を判断するアプローチを採用した。この選択により、ツールの目的に合致し、より正確なフィルタリングが可能になった。
開発者は、他の開発者から自分のリポジトリへの貢献に対する「コードレビュー」の経験も語っている。偶然にも、自分自身が他のリポジトリで実装したのと同じ機能が、今度は自分のリポジトリに提案された。言語は異なっていたが、機能のアイデアは同じだったという。このレビュープロセスでは、まず貢献者のGitリポジリを自分のローカル環境の「リモート」として追加し、その貢献者が作成した「プルリクエストブランチ」を自分のローカルに複製してテストした。これにより、提案された機能を自分のコンピュータで実際に動かし、動作を確認することができた。テストの結果、コードの構造に関する2つの問題を発見し、それらについてレビューコメント(スレッド)を作成した。貢献者がこれらのフィードバックに基づいてコードを修正した後、コメントを閉じ、プルリクエストを承認して自分のプロジェクトに統合した。
このレビュー経験では、コードのスタイルの一貫性を保つことの重要性も強く感じたという。自分のプロジェクトには一貫したコーディングスタイルがあったため、提案されたコードもそれに合わせるよう、スタイルに関するフィードバックも行った。
これらの経験を通じて、開発者はいくつかの重要な教訓を得た。まず、他の人のプロジェクトに貢献する際には、そのプロジェクトが持つ独自のスタイルや慣習を理解し、それに従うことが非常に重要だということ。自分のスタイルを押し付けるのではなく、プロジェクトに溶け込む姿勢が効果的な貢献につながる。また、一つの機能に取り組んでいる最中に、たまたま別のバグ(不具合)を見つけることもあり、もし可能であればそれらも修正して貢献することは、オープンソースの世界ではよくあることであり、非常に喜ばれる行動である。
コードレビューを行う側としては、プロジェクトのコードスタイルを一貫して維持することが非常に大切だと再認識した。これにより、プロジェクト全体の品質が保たれ、他の開発者もコードを理解しやすくなる。この一連の経験から、オープンソース開発は単にコードを書くことだけではないと学んだ。それは、プロジェクトのルールや慣習を理解し、高い品質基準を維持し、そして何よりも開発者コミュニティ内での良好な関係を築くことでもある。
オープンソース開発の協力的な性質は、バグの修正であれ、新機能の実装であれ、すべての貢献がプロジェクトをより良くすることに繋がるということを意味している。このような「与え、受け取る」というサイクルが、オープンソースのエコシステム全体をより堅牢で信頼できるものにしているのだ。