1. ホーム
  2. git

[解決済み] Git にファイルモード (chmod) の変更を無視させるには?

2022-03-15 01:39:47

質問

あるプロジェクトで、ファイルのモードを変更する必要があります。 chmod を 777 に変更する必要がありますが、メイン リポジトリでは変更する必要はありません。

Gitは chmod -R 777 . と表示され、すべてのファイルが変更されたものとしてマークされます。ファイルに加えられたモード変更をGitに無視させる方法はあるのでしょうか?

解決方法は?

試してみてください。

git config core.fileMode false

から git-config(1)です。 :

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

-c フラグを使用すると、一回限りのコマンドに対してこのオプションを設定することができます。

git -c core.fileMode=false diff

を入力すると -c core.fileMode=false は面倒なので、このフラグをすべての git repo に対して、あるいはひとつの git repo に対してのみ設定することができます。

# this will set your the flag for your user for all git repos (modifies `$HOME/.gitconfig`)
git config --global core.fileMode false

# this will set the flag for one git repo (modifies `$current_git_repo/.git/config`)
git config core.fileMode false

さらに git clonegit init を明示的に設定します。 core.fileMode から true で説明したように、レポの設定に Git グローバル core.fileMode false はクローン時にローカルに上書きされます。

注意事項

core.fileMode はベストプラクティスではないので、慎重に使用する必要があります。この設定は、モードの実行可能ビットのみをカバーし、読み取り/書き込みビットは決してカバーしません。多くの場合、この設定が必要だと思うのは、次のようなことをしたからでしょう。 chmod -R 777 すべてのファイルを実行可能にしています。しかし、ほとんどのプロジェクトでは セキュリティ上の理由から、ほとんどのファイルは実行可能である必要はなく、実行可能であるべきでもありません。 .

このような状況を解決する正しい方法は、フォルダとファイルのパーミッションを別々に、以下のような方法で処理することです。

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

このようにすれば、もう二度と core.fileMode ごく稀な環境を除いては。