パッチ:コミットメッセージから擬似差分を適用します。

2026/04/27 12:00

パッチ:コミットメッセージから擬似差分を適用します。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

GitHub の

.patch
出力形式は、標準的な GNU
patch -p1
を介したレガシー CLI ワークフロー(例:
wget/curl
)を使用して処理されると、コミットメッセージに埋め込まれた偽の差分を沈黙して適用することができ、GitHub の UI では実際のみの変更のみが表示される一方、出力されたパッチは正当な修正とコミット本文内にある差分形式のテキストが混在します。公開されている再現スクリプトにより、
readme.md
のみを更新する目的のパッチであっても、意図せず
SHOULD_NOT_BE_HERE.md
というファイルが作成されることを示すことができます。
git apply
および
git am
のようなツールは特定のパスを拒絶しますが、通常ファイルに対する注入された差分はまだ受理しますのに対し、
git cherry-pick
は Git オブジェクト上で異なる方法で動作します。根本原因は明確になっておらず、GNU patch、GitHub のエクスポートメカニズム、またはパッチ形式契約全体に起因する可能性があり、これらレガシー手法を使用している組織が隠された意図しない変更を適用するリスクにさらされている状態です。

本文

GitHub(および多くのその他のプラットフォーム)は、

.patch
の URL を介して電子メール形式のパッチデータを公開しています。これらのパッチをダウンロードして
GNU patch
に入力した際、コミットメッセージ内に含まれる「.diff 形式のテキスト」も、実際のパッチの一部であるかのように適用されてしまいます。私にとっては重要な点ですが、
wget
/
curl
patch
を組み合わせる運用が何か画期的な実験室環境を必要とするわけではないことを知ってください。これは、単一の実機からもう一台の実機へパッチを移動させるための非常に古くからある、ごく標準的な方法なのです。

公開再現手順(Public Reproducer)

From dd28283159930b8fff2119aa9f75af8b4c1ed8b2 Mon Sep 17 00:00:00 2001
From: Egor Kovetskiy <e.kovetskiy [spam] gmail.com>
Date: Wed, 22 Apr 2026 06:37:11 +0000
Subject: [PATCH] readme: add initial file

本文には、パッチのワークフローをテストするための偽の diff が含まれています。

diff --git a/SHOULD_NOT_BE_HERE.md b/SHOULD_NOT_BE_HERE.md
new file mode 100644
index 0000000..802992c
--- /dev/null
+++ b/SHOULD_NOT_BE_HERE.md
@@ -0,0 +1 @@
+Hello world
---
 readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 readme.md

diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..b44b8fd
--- /dev/null
+++ b/readme.md
@@ -0,0 +1 @@
+Demo repository

私が作成した最も小さな公開デモです:

dd28283
dd28283.patch

実際のコミットでは、ファイルの一つである

readme.md
のみが変更されています。GitHub の UI でこのコミットを検索した場合、これがすべてが表示されますが、コミットメッセージにはまた別の偽の統一形式の diff が含まれています:

diff --git a/SHOULD_NOT_BE_HERE.md b/SHOULD_NOT_BE_HERE.md
new file mode 100644
index 0000000..802992c
--- /dev/null
+++ b/SHOULD_NOT_BE_HERE.md
@@ -0,0 +1 @@
+Hello world

つまり、エクスポートされたパッチには以下の二層構造が成立しています:

  • 本物のパッチ
    readme.md
    を変更します。
  • 幻のパッチ(ファントム・パッチ):コミットメッセージの中に埋め込まれ、
    SHOULD_NOT_BE_HERE.md
    というファイルを生成します。

シナリオ:

wget -O /tmp/dd28283.patch \
  https://github.com/kovetskiy/git-example/commit/dd28283.patch
patch -p1 < /tmp/dd28283.patch

出力:

patching file SHOULD_NOT_BE_HERE.md
patching file readme.md

この

SHOULD_NOT_BE_HERE.md
ファイルは、実際には本物のコミットの一部ではありませんでした。

何か問題があるのでしょうか?

結論を下すのは難しいのですが、私の視点によると、

GNU patch -p1
は以下の二つのものを確実に区別できていないように思われます:

  • コミットからエクスポートされた実際の diff
  • コミットメッセージに埋め込まれた、diff のような形式のテキスト

範囲(Scope)

この公開デモでは通常のファイルを記述していますが、これは公開しやすく、かつ検証しやすいからです。ローカル環境でも、

.git/hooks/post-applypatch
をターゲットにしていましたが、
GNU patch
はそれを喜んで受け入れました(なぜ受け入れないでしょう、まさに)。幸いなことに、
git apply
および
git am
は、限定的な意味ではより適切に動作しました。つまり、
.git/...
パスに対する記述を却下しましたが、通常のワークツリーのファイルに対する注入された diff を依然として受理してしまいました。

ノート

git cherry-pick
の挙動は異なります。これは Git オブジェクトを直接操作するためです。

要点(Takeaway)

この問題が

GNU patch
のバグなのか、GitHub の
.patch
エクスポートの仕様なのか、あるいはより広範なパッチ形式に関する契約上の問題なのかについては、現時点では未解決です。しかしながら、次回からはコミットメッセージをより詳細に検討していきたいと思います。

同じ日のほかのニュース

一覧に戻る →

2026/04/29 4:44

Ghostty は GitHub から撤退します。

## Japanese Translation: GitHub ユーザー 1299 が 18 年にわたり作成・維持してきたターミナルエミュレータ Ghostty が、プラットフォーム上の重要なインフラ障害の発生により、創始者が現在それを重大な業務に不適切と見なし始めたことを受け、公式に GitHub を離れる予定である。最近の GitHub Actions の停電は数時間ほど PR レビューをブロックし、これは Git そのものの問題ではなく GitHub サービス自体の構造的な問題を浮き彫りにしている。同月中盤の主要な GitHub 障害(同日に Elasticsearch の障害も発生したが別の事件)と時期を同じくしてこの週に終了した議論が、プロジェクトの移行計画を見事に実現させながら、現在の URL で即時のコードアクセスのために読み取り専用ミラーを維持するという方針で進められた。創始者は、新たなホスティングソリューションを探す過程で、商業的およびフリーソフトウェアの複数のプロバイダーから依存関係を段階的に削除していくことを意図している。この動きは、不揃いなサービスレベルを持つ主要プラットフォームに依存するオープンソースプロジェクトの長期的な持続可能性に対する業界全体の懸念の高まりを示しており、維持者は利便性よりも安定性を最優先することを促している。

2026/04/29 8:54

ChatGPT も広告を表示しています。以下がその全体的な帰属循環のプロセスです。

## Japanese Translation: OpenAI は、ChatGPT に独自の広告システムを直接統合し、SSE ストリームに `single_advertiser_ad_unit` オブジェクトを注入し、クリエイティブ資産を独自ドメインである `bzrcdn.openai.com` 上にホストしています。ブラウザには OAIQ v0.1.3 という追跡用 SDK が実行されており、製品の閲覧情報を OpenAI のサーバーへ報告しています。このシステムは Fernet 暗号化されたトークン(例:`ads_spam_integrity_payload`, `oppref`, `olref`, `ad_data_token`)を使用しており、これらは公衆向けのヘッダーバイトを 9 文字含み、トークンの発行時刻の復元を可能にしています(例:2026 年 4 月 26 日)。クリックされたリンクは外部ではなく ChatGPT の内部ウェブビュー内(`open_externally: false`)で開かれるため、OpenAI はクリック後のナビゲーションを観察できます。アトリビューションチェーンには、720 時間の有効期限を持つファーストパーティcookieに格納されるフォワードトークン(`__oppref`)と、impression ログを記録する `olref` が使用されます。コンテキストターゲティングは、北京旅行、フライト、NBA など 6 つの異なる会話トピックで確認されています。広告出稿元には Grubhub や GetYourGuide があります。追跡を軽減するには、ドメイン `bzrcdn.openai.com` と `bzr.openai.com` をフィルタリングし、cookie(例:`__oppref`, `__oaiq_domain_probe`)を確認する必要があります。

2026/04/29 6:17

GitHub に至るまで

## 日本語訳: 中心的な論点是、GitHub が有用なツールから、オープンソースのアイデンティティに依存する脆弱で中央集権的なインフラへと進化しすぎているという点にある。この依存関係は危険であり、企業の管理不備と不安定性が、過去の記録と長年にわたって構築されたコミュニティへの信頼の双方を脅かしている。GitHub はコード共有を円滑化させ、事実上のプロジェクト放棄フォーク、イシュー、議論などのアーカイブとなったが、その台頭は npm エコシステムなどにおけるマイクロ依存関係の爆発的増加と同時期に起きたものである。 GitHub を以前に、オープンソースは評判、メーリングリスト、信頼できるメンテナ、そしてより多くの管理努力を要するが制御とコミュニティの文脈を保持できる自己ホスト化インフラ(例:Trac、Subversion)などに基づいていた。Git の分散型の性質が広く普及したにもかかわらず、GitHub はホスティングを単一の商用エンティティに集約し、これはソフトウェアコモンズの皮肉な中央集権化である。今日では、いくつかのプロジェクト(Ghostty、Strudel、Tenacity など)は、不安定なベンダーへの依存を回避するために、Codeberg などの独立したホスティングへ移行している。 今すぐ必要なのは、商業的モデルから完全に切り離された、公衆向けの資金を十分に得たアーカイブを作り、重要コード、リリースアソートメント、およびセキュリティ勧告や設計論争などを含む歴史的議論を保存することである。現在のようにプラットフォームの変更や急激な移行によって消えてしまう場合である。そのようなレジリエントなバックアップがない場合、業界は社会的歴史の不可逆的な損失に直面し、コミュニティが孤立しデータが脆弱になるリスクを抱えることになる。著者は GitHub の回復を望みつつも、オープンソースの歴史に対して単一のプラットフォームへの依存は無責任であると論じており、将来には pre-GitHub 時代の教訓と GitHub エポックの実態とのバランスが必要であるべきである。

パッチ:コミットメッセージから擬似差分を適用します。 | そっか~ニュース