Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 14552] ファイルの概要

このコミットは、Go言語の公式ドキュメントの一部である doc/articles/godoc_documenting_go_code.html ファイルのファイルパーミッションを変更するものです。具体的には、このHTMLファイルに誤って設定されていた実行可能ビット(execute bit)をクリアし、標準的な読み取り・書き込みパーミッションに修正しています。これにより、ファイルの意図しない実行を防ぎ、ファイルシステムの整合性を保ちます。

コミット

commit 23ca24018a161ccd60f8c72b39bd66d1660604f1
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Dec 4 20:37:19 2012 +0900

    doc: clear execute bit
    
    R=golang-dev, dave
    CC=golang-dev
    https://golang.org/cl/6871057

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/23ca24018a161ccd60f8c72b39bd66d1660604f1

元コミット内容

doc: clear execute bit

R=golang-dev, dave
CC=golang-dev
https://golang.org/cl/6871057

変更の背景

この変更の背景には、ファイルパーミッションの適切な管理という基本的なシステム管理の原則があります。doc/articles/godoc_documenting_go_code.html はHTMLドキュメントであり、実行可能なプログラムではありません。しかし、何らかの理由でこのファイルに実行可能ビット(x パーミッション)が付与されていました。

Unix系システムでは、実行可能ビットが設定されているファイルは、たとえそれがバイナリ実行ファイルでなくても、シェルスクリプトや他のスクリプトとして実行しようと試みられる可能性があります。HTMLファイルに実行可能ビットが設定されていると、以下のような問題や混乱を招く可能性があります。

  1. セキュリティ上の懸念: 悪意のあるスクリプトがHTMLファイルに埋め込まれていた場合、誤って実行されるリスクが増加します。
  2. 混乱と誤解: ファイルが実行可能であると誤解され、不適切な方法で扱われる可能性があります。
  3. ファイルシステムの整合性: ドキュメントファイルは通常、実行可能であるべきではないため、ファイルパーミッションがそのファイルの役割と一致しない状態は、ファイルシステムの整合性の観点から好ましくありません。
  4. Gitの挙動: Gitはファイルの実行可能ビットの変更を追跡します。不必要なパーミッションの変更は、リポジトリの履歴を不必要に複雑にする可能性があります。

このコミットは、このような不適切なパーミッションを修正し、ドキュメントファイルがその本来の役割に合ったパーミッションを持つようにするために行われました。

前提知識の解説

Unix系ファイルパーミッション

Unix系オペレーティングシステム(Linux, macOSなど)では、ファイルやディレクトリには「パーミッション(権限)」が設定されています。これは、誰がそのファイルに対して何ができるかを制御します。パーミッションは通常、3つのカテゴリのユーザーに対して設定されます。

  1. 所有者 (Owner): ファイルを作成したユーザー。
  2. グループ (Group): ファイルの所有者と同じグループに属するユーザー。
  3. その他 (Others): 上記のいずれにも該当しないすべてのユーザー。

それぞれのカテゴリに対して、以下の3種類の権限が設定されます。

  • 読み取り (Read - r): ファイルの内容を読み取ること、またはディレクトリの内容を一覧表示すること。
  • 書き込み (Write - w): ファイルの内容を変更すること、またはディレクトリ内のファイルを作成・削除・名前変更すること。
  • 実行 (Execute - x): ファイルを実行可能プログラムとして実行すること、またはディレクトリにアクセスしてその中のファイルに移動すること。

これらのパーミッションは、シンボリックモード(例: rwxr-xr--)またはオクタルモード(例: 754)で表現されます。オクタルモードでは、各権限に数値が割り当てられます。

  • r = 4
  • w = 2
  • x = 1

これらの数値を合計することで、各カテゴリのパーミッションを表します。

  • rwx = 4 + 2 + 1 = 7 (読み取り、書き込み、実行)
  • rw- = 4 + 2 + 0 = 6 (読み取り、書き込み)
  • r-x = 4 + 0 + 1 = 5 (読み取り、実行)
  • r-- = 4 + 0 + 0 = 4 (読み取りのみ)

オクタルモードの3桁の数字は、それぞれ所有者、グループ、その他のパーミッションに対応します。例えば、755 は「所有者は読み書き実行、グループは読み取りと実行、その他も読み取りと実行」を意味します。

Gitにおけるファイルモードの追跡

Gitは、ファイルのコンテンツだけでなく、特定のメタデータも追跡します。その一つが「ファイルモード」、特に実行可能ビットの状態です。Gitは、ファイルモードの変更を通常のコンテンツ変更と同様にコミットとして記録します。

  • old mode 100755: 変更前のファイルモード。
  • new mode 100644: 変更後のファイルモード。

ここで、100 は通常のファイルであることを示すGitの内部的なプレフィックスです。続く3桁がUnixパーミッションのオクタルモードを表します。

  • 755rwxr-xr-x を意味し、所有者は読み書き実行、グループとその他は読み取りと実行が可能です。
  • 644rw-r--r-- を意味し、所有者は読み書き、グループとその他は読み取りのみが可能です。

このコミットでは、755 から 644 へとモードが変更されており、実行可能ビットがクリアされたことがわかります。

技術的詳細

このコミットの技術的詳細は、Unix系ファイルシステムのパーミッションモデルと、Gitがその変更をどのように扱うかに集約されます。

doc/articles/godoc_documenting_go_code.html は、Go言語のドキュメントの一部であり、Webブラウザで表示されることを意図したHTMLファイルです。このようなファイルは、通常、実行可能である必要はありません。

元のパーミッション 100755 は、このファイルが所有者に対して読み取り、書き込み、実行の権限を持ち、グループおよびその他のユーザーに対して読み取りと実行の権限を持つことを示しています。HTMLファイルに実行権限が付与されているのは、ほとんどの場合、誤りです。これは、ファイルが作成された環境や、コピー・移動の際に意図せず実行可能ビットが引き継がれた結果である可能性があります。

新しいパーミッション 100644 は、所有者に対して読み取りと書き込みの権限を、グループおよびその他のユーザーに対して読み取りのみの権限を与えます。これは、一般的なテキストファイルやドキュメントファイルに推奨される標準的なパーミッション設定です。この変更により、以下の点が改善されます。

  • セキュリティ: HTMLファイルが誤って実行されるリスクがなくなります。
  • 整合性: ファイルの目的(ドキュメント)とパーミッションが一致し、ファイルシステムの整合性が向上します。
  • クリーンなリポジトリ: 不必要な実行可能ビットが削除されることで、Gitリポジトリの履歴がよりクリーンになります。

Gitは、git diff コマンドで old modenew mode を表示することで、このようなファイルモードの変更を明確に示します。これは、コードの変更履歴だけでなく、ファイルの属性変更も追跡するGitの強力な機能の一つです。

コアとなるコードの変更箇所

このコミットでは、ファイルのコンテンツ自体には変更がありません。変更されたのは、doc/articles/godoc_documenting_go_code.html という単一ファイルのファイルパーミッションのみです。

Gitの差分表示では、以下のようにモードの変更が示されています。

diff --git a/doc/articles/godoc_documenting_go_code.html b/doc/articles/godoc_documenting_go_code.html
old mode 100755
new mode 100644
  • old mode 100755: 変更前のファイルモード。
  • new mode 100644: 変更後のファイルモード。

コアとなるコードの解説

このコミットにおける「コアとなるコードの変更」は、厳密にはコードの変更ではなく、ファイルシステムのメタデータであるパーミッションの変更です。

  • old mode 100755:

    • 100: Gitが通常のファイルを示すプレフィックス。
    • 755: Unixパーミッションのオクタル表記。
      • 所有者 (7): rwx (読み取り、書き込み、実行)
      • グループ (5): r-x (読み取り、実行)
      • その他 (5): r-x (読み取り、実行) このモードは、スクリプトや実行可能バイナリによく見られますが、HTMLファイルには不適切です。
  • new mode 100644:

    • 100: Gitが通常のファイルを示すプレフィックス。
    • 644: Unixパーミッションのオクタル表記。
      • 所有者 (6): rw- (読み取り、書き込み)
      • グループ (4): r-- (読み取りのみ)
      • その他 (4): r-- (読み取りのみ) このモードは、一般的なテキストファイルやドキュメントファイルに推奨される標準的なパーミッションであり、HTMLファイルに適切です。

この変更は、git update-index --chmod=-x doc/articles/godoc_documenting_go_code.html のようなコマンド、またはファイルシステムのツール(chmod 644 doc/articles/godoc_documenting_go_code.html)を使って実行され、その変更がGitによって追跡・コミットされたものです。

関連リンク

参考にした情報源リンク

  • Unixファイルパーミッションに関する一般的なドキュメント
  • Gitのファイルモード追跡に関するドキュメント
  • chmod コマンドのマニュアルページ