概要
- Git管理されいているファイルの権限を任意の権限から777に変更した。差分を確認すると「644 → 755」に変更された旨の内容が出た。どうして777のファイルが755で扱われているのか気になって調べてみた。
Gitはファイルの権限情報を基本は保持しない
- 当たり前と言ったら当たり前なのだがGitはファイルの中身の差分しか基本的に保持しない。
- ただし例外的に
core.filemode
という設定がtrue
になっているときだけ権限情報を保持する。-
core.filemode
の設定値はローカルリポジトリで$ git config -l
を実行した出力内容の中に記載されている。
-
- しかし
core.filemode
がtrue
になっていようともGitが管理する権限はファイル所有者の権限が「読み書き実行(7)」かどうかのみ保持する。
そもそもファイルの権限とは
- Linuxのファイルの権限は下記の3種類である。
- 読み
- 書き
- 実行
- その権限にはそれぞれ整数が振られている。
- 読み → 1
- 書き → 2
- 実行 → 4
- 権限は整数の足し算で表される。
- 例えば「読み、書き、実行」権限がある場合「1 + 2 + 4 = 7」ということになる。
- Linuxのファイルに対するユーザーは書きの3種類である。
- 所有者
- 同グループユーザー
- その他ユーザー
- Linuxのファイル権限は必ず「3種類のユーザー」に対して設定され、「所有者、同グループユーザー、その他ユーザー」の順番で表される。
- 例えば下記のような権限のファイルがあったとする。
- 所有者が「読み書き実行(7)」できる
- 同グループユーザーが「読み実行(5)」できる
- その他ユーザーが「読み実行(5)」できる
- その場合当該ファイルの権限は「755」となる。
core.filemode
がtrue
だったとして
- 設定がONだったとしてもファイル所有者の権限がファイル所有者の権限が「読み書き実行(7)」かどうかのみGitは保持すると記載した。これはどういうことなのか。
- これは例えば「721」という権限のファイルだった場合、頭の7、つまり当該ファイルの所有者の権限が「読み書き実行」かどうかだけを保持する。
- そしてGitは権限の頭の数値が7の場合、強制的に「755」として保持する。
- なのでファイル権限が「777」だろうが「711」だろうが「741」だろうが頭の数値が7の場合必ず「755」として保持する。
- 逆に頭の数値が7以外の場合、権限が何であろうとも「644」として保持する。
まとめ
- Gitは基本権限情報を保持しない。
-
core.filemode
という設定がtrue
になっていると権限情報を保持する。 - ただし、ファイル所有者の権限が「読み書き実行(7)」かどうかしか保持しない。
- ファイル所有者の権限が7の場合Gitは「755」として権限を保持する。同グループユーザーやその他ユーザーの権限は何であれ関係ない。とにかく権限の頭が7なら「755」として保持する。