Linus Torvalds 氏の理想の git 運用と GitHub

Posted on 2023/03/05 in tech

Note
本記事の内容は Linus 氏の発言が人を傷つける場合に筆者がそれを良しと考えるといった意図はございません

少し古い記事になるが、 Linus Torvalds 氏 の GitHub に対する苦言が記事になっていた。

Linus 氏が GitHub について苦言を呈するのは今に始まったことではない(後述)が、
別に GitHub のすべてを否定しているわけではない。[1]

では一体何が不満なのか。Linus 氏の理想とする git の開発フローを考察した上で、整理してみたい。

Linus 氏の理想

結論からいうと、

「意味あるコミットを作れ」「コミットを大事にしろ」 という思想が伺える。

では 「意味あるコミット」「大事にされたコミット」 とは何なのか。 筆者なりに整理したところ以下 2 つに集約されるように思う。

  • 信頼性: パッチの身元がわかること

  • 説明性: パッチの目的・背景がわかること

信頼性: パッチの身元がわかること

ことさら OSS の開発において、信頼できるパッチを取り込むこと は、そのまま OSS の信頼性 に繋がる。

また、Author(著者、パッチ作成者)の合意なしにパッチを取り込むと、ライセンスの問題から OSS が OSS として存続できないリスク をはらんでしまうことさえあるだろう。 [2]

git は世界最大の OSS とでもいうべき Linux の開発課題を解決するために生まれたため、 [3] [4] [5]
これらの問題について考えて設計・機能追加されることは思想上自然のことと言える。

説明性: パッチの目的・背景がわかること

なぜ コミットを残したい のか。
それは単なる「バックアップの効率化」以上に、その「とき」を保存したいからに他ならない。

なぜこの修正をしたのか?

この修正により何が変わるのか?

この修正はどこからやってきて誰が行ったのか?

ソースコードの移り変わりに対し、変化のコンテキスト を「コミット」から読み取れなければ、それは単なるバックアップに過ぎないだろう。

パッチの出処を文書化するプロセス: sign off

Linux Kernel の 開発ガイド の一節には「sign off」を要求する一節がある。

It is imperative that all code contributed to the kernel be legitimately free software. For that reason, code from anonymous (or pseudonymous) contributors will not be accepted. All contributors are required to “sign off” on their code, stating that the code can be distributed with the kernel under the GPL.

Google 翻訳 による翻訳:

カーネルに貢献するすべてのコードは、合法的にフリー ソフトウェアである必要があります。 そのため、匿名 (または仮名) の貢献者からのコードは受け入れられません。 すべての貢献者は、GPL の下でカーネルと共にコードを配布できることを宣言して、コードを「承認」する必要があります。

操作的なことだけでいうのであれば、コミットは git commit --signoff のようにして作成せよということである。

この sign off を行うと、コミットメッセージに次のような 1 行が追加される。[6]

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

この 1 行を加えることで、パッチ提供者は Developer’s Certificate of Origin(直訳: 開発者の原産地証明 に同意することになる。

この sign off については SCO 社と IBM 社が Linux 関連ライセンスを巡って争った 際、
Linus 氏が提案したものである。

I know about digital signatures etc, and that is not what this is about. This is not about proving authorship - it’s about documenting the process. This does not replace or preclude things like PGP-signed emails, this is documenting how we work, so that we can show people who don’t understand the open source process.

Google 翻訳 による翻訳:

私はデジタル署名などについて知っていますが、それはこれに関するものではあり ません。 これは著者であることを証明することではなく、プロセスを 文書化 することです。 これは、PGP 署名付き電子メールのようなものを置き換えたり、排除したりするものではありません。これは、オープン ソース プロセスを理解していない人々に見せることができるように、私たちの作業方法を文書化したものです。

端的に言うとパッチ提供者に、このパッチは OSS ライセンスのもと利用して問題ないことを保証し提供します という宣誓を、 sign off によって文書化・明示化 させようというものである。 [7]

OSS へのコントリビュートを考えるとき、当然その OSS のライセンスに適合するパッチを提供することが大前提ではあろうが、 実際はライセンスに無頓着なプログラマからパッチが提供されることは間々あることだろう。

しかし冒頭で述べたように、OSS に取り込むパッチは信頼性のあるパッチを取り込む必要性があるため、パッチ提供者に対して自身が参加しようとしている活動の意味について考えさせること を意図したのが sign off なのである。 [8]

GitHub と sign off

前置きが長くなったが、まず GitHub にはこの sign off について意識する場面が存在しない

  • Web インターフェース上で手動コミットしても特に挿入オプションがあるわけではない

  • OSS ライセンスのコードへプルリクエストする際に sign off を促すといったアクションが存在しない

これらの機能が必須かといえばそうではないだろう。

ただ、GitHub はもはや git ホスティングにおけるデファクトスタンダードであり、良くも悪くも文化を作ってしまう

信頼のチェーン

2019 年時点で 4,000 人のコントリビュータを擁する開発 [9] において、コントリビュータすべてが信頼できる人物たるか、またパッチのすべてが信頼できるものか を把握することは不可能といっていいだろう。

Linus 氏が前述の Developer’s Certificate of Origin について説明しているメールに以下の一節がある。

These days, most of the patches in the kernel don’t actually get sent directly to me. That not just wouldn’t scale, but the fact is, there’s a lot of subsystems I have no clue about, and thus no way of judging how good the patch is.

Google 翻訳 による翻訳(一部修正):

最近では、カーネル内のほとんどのパッチは私へ直接送信されません。 それは単にスケールしないだけでなく、実際問題私が手がかりを持たない多くのサブシステムがあり、したがってパッチがどれほど良いかを判断する方法がありません。

ここで git の 運用思想 [10] にも通ずる重要なことを述べている。

So I end up seeing mostly the maintainers of the subsystem, and when a bug happens, what I want to see is the maintainer name, not a random developer who I don’t even know if he is active any more. So at least for me, the chain is actually mostly more important than the actual originator.

There is also another issue, namely the fact than when I (or anybody else, for that matter) get an emailed patch, the only thing I can see directly is the sender information, and that’s the part I trust. When Andrew sends me a patch, I trust it because it comes from him - even if the original author may be somebody I don’t know. So the path the patch came in through actually documents that chain of trust - we all tend to know the "next hop", but we do not necessarily have direct knowledge of the full chain.

DeepL 翻訳(一部修正):

バグが発生したときに見たいのは、もう活動しているかどうかもわからないランダムな開発者ではなく、
メンテナの名前なんです。ですから、少なくとも私にとっては、実際の発案者よりも チェーン の方が重要なのです。

また、もうひとつの問題があります。それは、私(あるいは他の人)が電子メールでパッチを受け取るとき、
直接見ることができるのは送信者の情報だけであり、それは私が信頼する部分でもあります。
アンドリューからパッチが送られてくると、たとえ元の作者が知らない人であっても、それは彼から送られてきたものだから信用できる。
つまり、パッチが送られてきた 経路 は、信頼の連鎖を実際に文書化したものなのです - 私たちは皆、
「次のホップ」を知っている傾向にありますが、必ずしも完全な連鎖を直接知っているわけではありません。

特定の個人 ではなく チェーン が重要だと言っている。

つまり パッチ および パッチを開発した本人 を直接信頼するわけ ではなく、 その パッチを送ってくれた人 を信頼していれば、そのパッチを信頼する、という考え方である。

これは別に Linus 独自の思想ではなく Web of trust の基本的な考え方であり、[11]

とてもシンプルに言ってしまえば「この人の言うことだから信頼できる」ということである。

GitHub が作るコミット

冒頭記事のきっかけになった一連のメールの中で、以下の言及がある。

That’s another of those things that I really don’t want to see - github creates absolutely useless garbage merges, and you should never ever use the github interfaces to merge anything.

This is the complete commit message of that merge:

Merge branch 'torvalds:master' into master

Yeah, that’s not an acceptable message. Not to mention that it has a bogus "github.com" committer etc.

筆者訳:

これも、本当に見たくないことの一つ、github が作成したまったく役に立たないゴミのようなマージです。
github のインターフェースを使って何かをマージすることは何があっても決してすべきではありません。

これはそのマージ(訳註: github が作成したマージ)のコミットメッセージそのままのものです:

Merge branch 'torvalds:master' into master

ええ、許容できるメッセージではありません。
"github.com" という偽コミッタのことなどは言うまでもありません。

なかなかに辛辣な言い方だが、要は GitHub でコミットを作るな と言っている。

GitHub の標準コミットメッセージ

Merge branch 'torvalds:master' into master

これの何が問題なのだろうか。

Linus 氏自身のマージコミットを参考にしてみよう:

Merge tag 'nfsd-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux

Pull nfsd updates from Chuck Lever: "Two significant security enhancements are part of this release:

  • NFSD’s RPC header encoding and decoding, including RPCSEC GSS and gssproxy header parsing, has been overhauled to make it more memory-safe.

  • Support for Kerberos AES-SHA2-based encryption types has been added for both the NFS client and server. This provides a clean path for deprecating and removing insecure encryption types based on DES and …​.

ショートメッセージ [12] に続き、著者の説明を引用していることがわかる。

まずショートメッセージを見てみると、

Merge tag 'nfsd-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux

  • どこのリポジトリから(git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux から)

  • なにを (タグ nfsd-6.3 を)

マージしたかがわかる。

つまりこの 1 行だけで 出典のリポジトリどのコミットをマージしたのか がわかるようになっている。

これを踏まえて今一度 GitHub が作成したコミットメッセージに戻ると

Merge branch 'torvalds:master' into master

なるほど、どうやら torvalds:master なるブランチがあり、master にマージされたらしいということはわかる。

が、何かの役に立つだろうか。

少なくとも、先程の「信頼のチェーン」を辿ることは、これだけだと難しい。

一応補足すると、GitHub のプルリクエストを使ったマージコミットを作成すると以下のようになる。

Merge pull request #123 from someone/some-branch

GitHub ユーザであれば「プルリクエスト 123 で someone ユーザのブランチがマージされたんだな」と推測できるかも知れないが、 このメッセージに「GitHub 上で」といった説明があるわけでもない。 [13]

GitHub でコミットしたときのコミッタ

a bogus "github.com" committer

("github.com" という偽コミッタ)

とはなんだろうか。

commit 11e4e66efd440216032f53ee7e5ca08cd263a292
Merge: 96b18047a717 e22ce8eb631b
Author:     aalexandrovich <88376726+aalexandrovich@users.noreply.github.com>
AuthorDate: Mon Aug 23 16:44:22 2021 +0300
Commit:     GitHub <noreply@github.com>
CommitDate: Mon Aug 23 16:44:22 2021 +0300

    Merge branch 'torvalds:master' into master
実際に確認する手順はこちら
# ソース取得
$ git fetch https://github.com/Paragon-Software-Group/linux-ntfs3.git 11e4e66efd440216032f53ee7e5ca08cd263a292
From https://github.com/Paragon-Software-Group/linux-ntfs3
 * branch                      11e4e66efd440216032f53ee7e5ca08cd263a292 -> FETCH_HEAD

# コミット表示
$ git log -1 --format=fuller 11e4e66efd440216032f53ee7e5ca08cd263a292

この

Commit:     GitHub <noreply@github.com>

のところが問題の「偽コミッタ」である。

前提として、git はコミットの際

  • Author

  • Committer

という 2 つの要素をコミットオブジェクトに付与する。

Author とは、パッチの著者 であり、
Committer とは パッチを適用した人 を指す。

普段の開発では Author と Committer が一致することがほとんどであろうが、 メールでパッチを受け取る場合や [14]cherry-pick でコミットを作成した場合などでは
パッチを作成する人(コードを書く人)パッチを適用する人 が別になることは往々にしてありえるだろう。

「誰がパッチを適用したか」というのも「信頼のチェーン」を辿る上では欠かせない情報であるはずだが、

GitHub 上でコミットを作成すると、この Committer が「GitHub」になり、先程の「信頼のチェーン」の繋がりを辿れなくなってしまうのだ。

GitHub と GPG 署名と Verified コミット

ちなみにこの記事を最初に書いていた 2023 年 3 月現在、 GitLab は Web インターフェース上でコミットしたときの Committer 名や Committer メールアドレスは 設定によって変更できる
また Bitbucket も確認する限り、アカウントに紐づくメールアドレスと名前が Committer に設定されるようだ。

ではなぜ GitHub は GitHub インターフェース上で作成したコミットの Committer を「GitHub」にするのだろうか。

これは推測に過ぎないが、 GitHub 自身で作成したコミットを Verified なコミットとして扱いたい ゆえだからではないだろうか。

GitHub の Web インタフェース上でコミットを行うと、Web インタフェース上で Verified と表記される。

GitHub サービス自身がもつ GPG 秘密鍵 による署名が行われ、
そのコミットも「Verified」となる。

ここでポイントとなるのが、 一定の条件 の中に committer と署者のメールアドレスが一致している必要がある ということ。

つまり GitHub 自身がこの仕様を遵守すると、 GitHub 以外がコミッタであるコミットオブジェクトには署名ができない。

筆者が初めにこの実態を知ったとき、 GitHub がユーザの意図とは違うコミットを作成していたなら、その責任は GitHub にあると言えるだろうから、コミッタが GitHub であるというのは理にかなっているのでは? とも思った。

ただ、GitHub を一種の git クライアントとして見做したときに「git クライアントそのものの情報をコミッタ情報に設定する」という操作をしたいユーザが果たしているのだろうか。 GitHub による GPG 署名含め、せめて設定化できないものなのだろうか。

Linus 氏の考えるインタフェース

Linus 氏は文句を言うだけでなく、あるべき機能について GitHub 上の issue 機能上でコメントしている。[16]

So the github commit UI should have

  • separate "shortlog" one-liner text window, so that people cannot screw that up.

  • some way to actually do sane word-wrap at the standard 72-column mark.

  • reminders about sign-offs etc that some projects need for project-specific or even legal reasons.

筆者訳:

なので github のコミットUIは 以下を備えるべきだ。

  • 分離したワンライナー "shortlog" テキストウィンドウ。これにより、人々がコミットを台無しなものにできなくなる。

  • 標準的な 72 カラム地点のマークによって適切なワードラップを実際にさせる手段。

  • プロジェクト特有の理由あるいは法的な理由によって必要される sign-off 等のためのリマインダ。

語弊を恐れずにいうと いい仕事をしよう ということだ。

Tag のプルリクエスト

信頼性 の話のひとつに、タグによるプルリクエスト についても触れている。

For github accounts (or really, anything but kernel.org where I can just trust the account management), I really want the pull request to be a signed tag, not just a plain branch.

意訳:

github アカウント(実際にはアカウントが信頼できる kernel.org 以外のもの)では、 プルリクエストはプレーンなブランチではなく署名付きタグであってほしいです。

In a perfect world, it would be a PGP signature that I can trace directly to you through the chain of trust, but I’ve never actually required that.

意訳:

理想の世界では、PGP 署名が信頼のチェーンを通して直接追跡できる術(すべ)になると思いますが、実際それを要求したことはありません。

So while I prefer to see a full chain of trust, I realize that isn’t always easy to set up, and so at least I want to see an "identity" that stays constant so that I can see that pulls come from the same consistent source that controls that key.

意訳:

完全な信頼のチェーンを見たいと思う一方で、それが簡単に用意できるものではないことを理解しています。 だからせめて不変な「身元」を確認することで、その pull が、署名鍵を管理する一貫性のあるソースからのものであることを確認したいのです。

「マージ」という操作(git merge による操作)はブランチに対してだけではなく、任意のリビジョンに対して実施できる。

とりわけ PGP 署名付きのタグをマージすると、署名がコミットに含まれる:

署名付きタグをマージすることで作られたマージコミットを git cat-file で出力すると、署名の様子を見ることができる。
$ git cat-file -p 926de8c4326c14fcf35f1de142019043597a4fac
tree e6a1d59f16438a9231b551b28d87f0abee8dfe93
parent d6498af58f5c7fb7b252f4791620fe4dd7213ca3
parent 8fbc1c5b91133f7ae5254061d2cb3326992635c4
author Linus Torvalds <torvalds@linux-foundation.org> 1631305744 -0700
committer Linus Torvalds <torvalds@linux-foundation.org> 1631305744 -0700
mergetag object 8fbc1c5b91133f7ae5254061d2cb3326992635c4
 type commit
 tag acpi-5.15-rc1-3
 tagger Rafael J. Wysocki <rjw@rjwysocki.net> 1631299746 +0200

 Additional ACPI updates for 5.15-rc1

  - Prevent a message about missing PRMT from being printed on systems
    that do not support PRM, which are the majority now (Aubrey Li).

  - Drop unnecessary header include from scan.c (Kari Argillander).

  - Update the list of ACPICA maintainers after recent departure of
    one of them (Rafael Wysocki).
 -----BEGIN PGP SIGNATURE-----

 iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmE7qKISHHJqd0Byand5
 c29ja2kubmV0AAoJEILEb/54YlRxA98P/2lFdmZb/Wv7jVd97DTDgE09k9G9T8EX
 e0dt4ZFwh8U0yNnxGuskDMAp8W5QP4rd6dZrD3ici3ebR63zzuUg8vdlY3yS2pXT
 15qxTca5505ffKp+LTaKIC7fGC3SolSEF8BAG6vKcLc8A0JDNZcuAALYWBsUzB36
 FAYKp4b/jnmNSsocHl9Uatwo5sJU2gy2aLIu8V1e07WHgS3ywljBhBrQSIDOGyZG
 8vQqWALUviGU1jSM0JYIuBPPZPSLIhc0Y3jp/9GNZDcT3St9IQktjQckBIjxemd8
 UQJrk+Y7ZkgtDzcDPIZOB3oyOvYsPiMz+VkLLzA9kzNqS/UOa1p9rNBt/UBIaSug
 rB5P+iU6Ub9tYpS/E6r2T49vov4H5rgHsF+0kG/9UwZFSYSYHiIzH/ellPDQAv4h
 rNxUs2NFz+V4fsj913A06+/T7bBKO7E24fLmQCCfuJknUPIwPwoM60nk7oMKKNeV
 j/rMyr4BoCA51JOnynjrrBfZkKgHoMKPfLuU18Rcmgz2OCpSzN2f+njROMIm3jmn
 LwgnpJOJmCs0cuPPNMkuz7ETlvk1fiVbCS1iZNkUlC8B5V358p1uJAGWZSdcx+D/
 jYK9qPT652/Xc29xxgV0asaDVd8odR6YxDMqT9RsI34KIXTghZDS7qSBeeVwhUi5
 QWqGWlAZsNH0
 =CmpE
 -----END PGP SIGNATURE-----

Merge tag 'acpi-5.15-rc1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull more ACPI updates from Rafael Wysocki:
 "These prevent a confusing PRMT-related message from being printed,
  drop an unnecessary header file include and update the list of ACPICA
  maintainers.

  Specifics:

   - Prevent a message about missing PRMT from being printed on systems
     that do not support PRM, which are the majority now (Aubrey Li).

   - Drop unnecessary header include from scan.c (Kari Argillander).

   - Update the list of ACPICA maintainers after recent departure of one
     of them (Rafael Wysocki)"

* tag 'acpi-5.15-rc1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPICA: Update the list of maintainers
  ACPI: PRM: Find PRMT table before parsing it
  ACPI: scan: Remove unneeded header linux/nls.h

署名はもちろん検証に使うことができ、これは --show-signature オプションなどで確認できる。[17]

$ git log --show-signature -1 --format=full 926de8c4326c14fcf35f1de142019043597a4fac
commit 926de8c4326c14fcf35f1de142019043597a4fac
merged tag 'acpi-5.15-rc1-3'
gpg: Signature made Sat Sep 11 03:49:06 2021 JST
gpg:                using RSA key E1F71CEB570679E1C3FDF0B082C46FFE78625471
gpg:                issuer "rjw@rjwysocki.net"
gpg: Good signature from "Rafael J. Wysocki <rjw@rjwysocki.net>" [unknown]
gpg:                 aka "Rafael J. Wysocki <rjwysocki@gmail.com>" [unknown]
gpg: WARNING: The key's User ID is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: FD71 EF3B AE42 69FE 090D  A0BF EF1F 7EB8 765E 435D
     Subkey fingerprint: E1F7 1CEB 5706 79E1 C3FD  F0B0 82C4 6FFE 7862 5471
Merge: d6498af58f5c 8fbc1c5b9113
Author: Linus Torvalds <torvalds@linux-foundation.org>
Commit: Linus Torvalds <torvalds@linux-foundation.org>

    Merge tag 'acpi-5.15-rc1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

GitHub で作成できるプルリクエスト

タグによってプルリクエストを作成する 文化について知っている開発者はどれだけいるだろうか。[18]

事実、GitHub のプルリクエストはブランチでしか作成できない。

見習いエンジニアには git は GitHub の使い方とセットで覚えた・覚えさせられた 方も多いのではなかろうか。

タグ vs ブランチ

なぜ Linus 氏は タグ によるプルリクエストを求めるのか。

その理由については、先ほどの引用がヒントになる。

and so at least I want to see an "identity" that stays constant so that I can see that pulls come from the same consistent source that controls that key

意訳:

だからせめて不変な「身元」を確認することで、その pull が、署名鍵を管理する一貫性のあるソースからのものであることを確認したいのです。

master ブランチによるプルリクエストメール に対する返信の一文であることを踏まえると、「一貫性のあるソース」とは プルリクエストで送られたソースプルリクエスト作成時点 から不変であることを期待しているものと思われる。

ブランチ はコミットが積み上がる 変化ありき のものであり、一貫性のあるソースとは言えない。不要になれば削除されるかもしれない。 [19]

一方 タグ不変 なものであり、その参照先を変えることは基本的に想定されていない。 [20]

GitHub で一度プルリクエストを作成すれば、そのブランチの更新履歴は GitHub の UI から確認することはできるだろう。

ただメールによるプルリクエストでは、メールに記載された 「何をプルしてほしいのか」 が、メール送信・受信時から変わっていない という一貫性が前提になければ、無闇にそれをプル(マージ)できない。

そのために タグ を利用せよ、と Linus 氏は言いたいのであろう。

タグはプルリクエストに適している

先程の Linus 氏のマージコミットをもう一度見てみると、

Merge tag 'nfsd-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux

Pull nfsd updates from Chuck Lever: "Two significant security enhancements are part of this release:

  • NFSD’s RPC header encoding and decoding, including RPCSEC GSS and gssproxy header parsing, has been overhauled to make it more memory-safe.

  • Support for Kerberos AES-SHA2-based encryption types has been added for both the NFS client and server. This provides a clean path for deprecating and removing insecure encryption types based on DES and …​.

メッセージ本文に引用が含まれているが、この引用元は次の アノテートタグ に記録されたメッセージであることが伺える:

アノテートタグ にはコミットと同様 メッセージを残すことができる

タグ を使ったプルリクエストを作ることで、pull を request する その背景を記録することができ、マージ 後も git の履歴として 信頼のチェーンを残し続けられるということだ。

github does some things very well

なるほど Linus 氏は GitHub のことを憎んでいるのかというと、興味深いコメントを残している。

.. because I think github does some things very well.

So sure, you may think I hate github. I don’t. I hate very specific parts of github that I think are done badly.

But other parts are done really really well.

I think github does a stellar job at the actual hosting part. I really do. There is no question in my mind that github is one of the absolute best places to host a project. It’s fast, it’s efficient, it works, and it’s available to anybody.

That’s wonderful. I think github is absolutely lovely in many respects.

And that then makes me really annoyed at the places where I think github does a subpar job: pull requests and committing changes using the web interface.

DeepL 翻訳:

…​というのも、githubはいくつかの点で非常によくできていると思うからです。

だから確かに、あなたは私がgithubを嫌っていると思うかもしれません。そうではありません。githubの特定の部分、悪いと思う部分は嫌いです。

しかし、他の部分は本当によくできています。

githubは実際のホスティングの部分では素晴らしい仕事をしていると思います。本当にそう思います。githubは、ホスティングを行う場所としてプロジェクトのホスティングに最適な場所のひとつです。速いし、効率的だし、ちゃんと動くし、誰でも使えるし。

それは素晴らしいことです。githubは多くの点で本当にすばらしいと思います。

そのため、githubが劣悪な仕事をしていると思う場所、つまりプルリクエストやウェブインターフェイスを使った変更のコミットには、本当にイライラさせられます。

GitHub はすばらしい。ちゃんと使える。ちゃんと使えるがゆえに、よくない仕様については腹が立つ。

Linus 氏の発言はしばしば物議を醸すが、 不敬なヤツほど正直だという研究 もあるらしい。

単純な GitHub 憎しで批判しているわけではないだろう。

所感

最近また Linus 氏がマージコミットに対してコメントしたらしい。

本記事は 2021 年末に書いたのだが、下書きのまま放置していた記事だった。 上記の記事を読んで、改めて本記事の清書に至ったという経緯がある。

私は 強いエンジニアほどコミットは大事にしている と考えている。

もちろん「強いエンジニア」の定義は一概に言えるものではないだろう。

ただおそらく言えるのは「本質的な仕事ができる」ことは強いエンジニアの必要条件だと思う。

「本質的な仕事」をする上で、コミットを大事にしなくてよい場面がもしあるのなら、無闇にそこへコストをかけるべきではないかもしれない。

目先のことに囚われず、長期的な視点でもって、いま目の前の仕事ひとつひとつに対して考えることをやめない、「本質的な仕事のために努力する」作り手がいたとする。

そんな作り手が、思考の放棄された仕事 を受け取ったとき、一体どう感じるだろうか。

あなたはなぜコードを書いた? 動かなかったから? 直せと言われた? ただの気晴らし? 世界をよりよくしたかった?

AI が Google のコーディング試験さえ受かる時代に、考えることをやめたプログラマーには何が残るのか。

プログラマ需要が急増する現在、git ホスティングのデファクト・スタンダードと言える GitHub には、文化 ないしは 因習 まで作ってしまう影響力があると言っていいだろう。

Linus 氏の歯に衣着せぬ発言は、ときとして世のプログラマ達を賑わせる。 その真意について、本質的に捉えたいものである。

CHANGELOG


1. git を作ったのは Linus 氏その人である。一応の注記。
2. ライセンスの明示されない脆弱性修正パッチがメーリングリストに投稿されたことで、 それを見てしまった Ruby のメンテナがその脆弱性を直せなくなったことがある
7. sign off はプロジェクトごとに意味合いが変わりうるものであり ドキュメント にも “The meaning of a signoff depends on the project to which you’re committing” と記載がある
8. コントリビュータの質を上げるプロセスを通して、事の発端となった訴訟問題を副次的に予防可能とした辺り、Linus 氏の知性の高さが伺える
10. 設計思想 とも言えなくはないが「git それ自体の設計により副次的に担保しやすくなった運用」であると思われるので「運用思想」という語を用いた
11. PGP でいうなら「この鍵を信頼する」というアクションが信頼のチェーンを作ることになるが、ここではシンプルに「この人からのメールを信頼する」というアクションによって信頼のチェーンを作っている
12. コミットメッセージの冒頭 1 行
13. 後述する committer が github.com になっていることから推測できなくないが…
16. 実際にはメールを使ったコメントであると思われる
17. マージコミットの Committer・Author は Linus 氏だが署名は Rafael 氏のものであることがわかる
18. git 好きを公言していながら筆者も記事を読んで知った
19. マージされる・されないにかかわらず「どういうレビュー過程を経たのか」をメーリングリスト上から辿れることは、アーカイブ性の観点からも重要であると考えられ、無闇にその参照先が削除されるべきではない
20. ドキュメントを参照されたし

git