web-dev-qa-db-ja.com

Gitにファイルモード(chmod)の変更を無視させるにはどうすればいいですか?

開発中にchmodを持つファイルのモードを777に変更しなければならないプロジェクトがありますが、メインレポジトリでは変更しないでください。

Gitはchmod -R 777 .をピックアップし、すべてのファイルに変更済みのマークを付けます。 Gitにファイルへのモード変更を無視させる方法はありますか?

2065
Marcus Westin

試してください:

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フラグを使用して、1回限りのコマンドにこのオプションを設定できます。

git -c core.fileMode=false diff

そして--globalフラグはそれをログインユーザーのデフォルトの振る舞いにします。

git config --global core.fileMode false

警告

core.fileModeはベストプラクティスではないため、慎重に使用する必要があります。この設定はmodeの実行可能ビットのみをカバーし、read/writeビットはカバーしません。多くの場合、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を使う必要がなくなります。

3410
Greg Hewgill

作業ツリーのモード変更を元に戻す:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

あるいはmingw-gitで

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x
258
yoda

すべてのレポジトリにこのオプションを設定したい場合は、--globalオプションを使用してください。

git config --global core.filemode false

これでうまくいかない場合は、おそらく新しいバージョンのgitを使用しているので、--addオプションを試してください。

git config --add --global core.filemode false

--globalオプションを指定せずにこれを実行し、作業ディレクトリがリポジトリではない場合は、次のようになります。

error: could not lock config file .git/config: No such file or directory
123
adrien

もし

git config --global core.filemode false

あなたのために働かない、手動でそれをしなさい:

cd into yourLovelyProject folder

.gitフォルダに移動します。

cd .git

設定ファイルを編集します。

nano config

trueをfalseに変更

[core]
        repositoryformatversion = 0
        filemode = true

- >

[core]
        repositoryformatversion = 0
        filemode = false

保存して終了し、上のフォルダに移動します。

cd ..

gitを再起動

git init

これで終わりです!

72
Sinan Eldem

Greg Hewgillに追加します。core.fileMode設定変数を使用した場合):

git update-index ( "git add"の低レベル版)の--chmod=(-|+)xオプションを使用すると、 "git commit"を使用した場合に選択される場所から、インデックス内の実行権限を変更できます。 "git commit -a").

50
Jakub Narębski

グローバルに設定できます。

git config --global core.filemode false

上記の方法でうまくいかない場合は、ローカル設定がグローバル設定を上書きしている可能性があります。

ローカル設定を削除して、グローバル設定を有効にします。

git config --unset core.filemode

あるいは、ローカル設定を正しい値に変更することもできます。

git config core.filemode false

34
Tyler Long

chmod commandをすでに使用している場合は、ファイルの違いを確認してください。以前のファイルモードと現在のファイルモードが表示されます。

新しいモード:755

旧モード:644

下記のコマンドを使用してすべてのファイルの古いモードを設定します

Sudo chmod 644 .

コマンドを使用するか手動で、configファイルでcore.fileModeをfalseに設定するようになりました。

git config core.fileMode false

次にchmodコマンドを適用して、次のようにすべてのファイルのアクセス権を変更します。

Sudo chmod 755 .

そして再びcore.fileModeをtrueに設定します。

git config core.fileMode true

ベストプラクティスとして、core.fileModeを常にfalseにしないでください。

20
Kishor Vitekar

次のエイリアス(〜/ .gitconfig)を定義することで、gitコマンドごとのfileModeを簡単に一時的に無効にすることができます。

nfm = "!f(){ git -c core.fileMode=false $@; };f"

この別名がgitコマンドの前に付いていると、ファイルモードの変更は、それ以外の場合には表示されるコマンドと一緒に表示されません。例えば:

git nfm status
14
Ville

(サブモジュールを含めて)再帰的に設定ファイルでfilemodeをfalseに設定したい場合:find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'

14
dryobs

シンプルなソリューション:

これをヒットシンプルなコマンドプロジェクトフォルダーで(元の変更を削除しません) ...それは変更を削除でした- 完了変更中プロジェクトフォルダーの権限

コマンドは次のとおりです:

git config core.fileMode false

不要なファイルがすべて変更される理由: commendでプロジェクトフォルダーのアクセス許可を変更したためSudo chmod -R 777 ./yourProjectFolder

あなたが行っていない変更をいつチェックしますか? git diff filenameを使用しているときに次のように見つかりました

old mode 100644
new mode 100755
2
ngCourse

これは私のために働く:

find . -type f -exec chmod a-x {} \;

オペレーティングシステムに応じて

find . -type f -exec chmod a+x {} \;
1
Martin Volek