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


2311

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

Git chmod -R 777 .はすべてのファイルを取得し、変更済みとしてマークします。ファイルに加えられたモードの変更をGitに無視させる方法はありますか?


17
これは、Windowsでgit + Windows上のUbuntuでBashを使用する場合に役立ちます
Elazar

4
の特定の呼び出しに対する権限の変更を無視したいだけでgit diff、したがってGit構成ファイルを変更したくない場合はgit diff -G.Zedの回答をここで使用できます。
sampablokuper

回答:


3823

試してください:

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

また、この--globalフラグにより​​、ログインしたユーザーのデフォルトの動作になります。

git config --global core.fileMode false

グローバル設定の変更は、既存のリポジトリには適用されません。さらに、git cloneおよびgit init明示的に設定core.fileModeするtrueで説明したようにレポの設定でクローン上でローカルに上書きGitのグローバルcore.fileModeの偽

警告

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、非常にまれな環境を除いて、を使用する必要はありません。


203
その場合はgit config --global core.filemode false、すべてのリポジトリに対してこれを1回だけ実行する必要があります。
グレッグ

13
これは、filemodeではなくfileModeである必要がある場合を修正するまで機能しませんでした
tishma

8
@tishma:ドキュメントによると、 Git構成セクションと変数名は大文字と小文字が区別されません。CONFIGURATIONFILEセクションを参照してください。上記が機能しない場合は、別の理由でした。
Greg Hewgill、

11
@donquixote:このgit configコマンドは、設定を正しい構成ファイルに書き込みます(.git/config現在のリポジトリのみ、またはと一緒に~/.gitconfig使用する場合--global)。
グレッグ・ヒューギル2013年

8
@ zx1986:関係ありません。git configから:「変数名は大文字と小文字を区別しない、...」
Greg Hewgill

277

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

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

42
OS X Lionでは、この-d'\n'部分は省略しxargsてください。これは違法な議論です(必要ありません)。
Pascal

9
「chmod: `+ x 'の後にオペランドがありません」に関するエラーはすべて無視できます
Casey Watson

5
これは最新ですか?mingwで「chmod:引数が少なすぎる」というメッセージが表示される
hammett

7
@Pascal @pimlottc -dは、区切り文字を空白ではなく改行に指定します。BSD xargsにはそのオプションはありませんが、代わりに出力をパイプしてからtr '\n' '\0'-0argをxargsに使用して、区切り記号としてNULを使用できます。
Mark Aufflick 2013年

10
かっこいい、trうまくいきました!ここではOSXのための完全なコマンドがあります:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
K. -マイケル・エイ

135

すべてのリポジトリにこのオプションを設定する場合は、--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

5
後でGITの用途のように見える--addのように、git config --add --global core.filemode false
mgaert

14
リポジトリのローカル構成にfilemode = trueがすでにある場合、ローカル構成がグローバル構成をオーバーライドするため、グローバル構成を変更しても効果がありません。マシンの各リポジトリのローカル構成を一度変更する必要があります
Rakib

3
ください:syedrakibの警告でこの回答を更新してください!私がそれを見つける前にすべてが正気を失い、その後完全に理解しました。
jerclarke 2016年

88

もし

git config --global core.filemode false

あなたのために機能しません、それを手動で行います:

cd into yourLovelyProject folder

.gitフォルダーにcdします。

cd .git

構成ファイルを編集します。

nano config

trueをfalseに変更

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

保存、終了、上位フォルダに移動:

cd ..

gitを再初期化する

git init

完了です!


11
編集する代わりに、プロジェクトのルートに.git/configあるシンプルなものgit config core.fileMode falseで十分です。設定ファイルを編集する場合は、ディレクティブを完全に削除して、グローバルディレクティブを選択することをお勧めします。
Felix、

6
-1 git config --globalが機能しない場合、システムレベルで実行する権限がないことを意味します。globalオプションを削除すると、.git / configを手動で編集するのとまったく同じことが行われます
CharlesB

@CharlesBが正しくありません-回答は、オプションをプロジェクトに直接配置することで回避策を提供し、プロジェクト固有のものにしました。これは、将来作成またはチェックアウトする他のgitプロジェクトでは機能しませんが、作業中のプロジェクトでは機能します。(明確~/.gitconfigにすることを確認しましょう、および~/project/.git/config
ddavison

これが実行git initされたら、filemodeをtrueに戻す必要がありますか?
ジョーダン

53

Greg Hewgillの回答に追加(構成core.fileMode変数を使用):

あなたは使用することができます--chmod=(-|+)xのオプションgitの更新インデックス、あなたが使用している場合、「-aをコミットgitの「コミットGIT」(とない拾い上げられるところから、インデックス内の実行権限を変更する(「gitの追加」の低レベル版) ")。


2
これは、個別の回答として追加されるのではなく、グレッグ・ヒューギルの回答に編集され、単一の明確な表現を持つ1つの最高の回答を作成する必要があります。
グレッグ

6
@Greg:自分の答えではなく編集するのに十分なポイントが必要です。当時は編集権限が足りなかったと思います。
JakubNarębski12年

1
@Jakub私はあなたに今十分な評判があると思います:)このコマンドはサンプルファイルに対してどのように見えるでしょうか?
アレックスホール

38

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

git config --global core.filemode false

上記の方法がうまくいかない場合は、ローカル構成がグローバル構成をオーバーライドしていることが原因である可能性があります。

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

git config --unset core.filemode

または、ローカル構成を適切な値に変更することもできます。

git config core.filemode false


4
主な答えが役に立たない場合-これを試してください。ローカル構成を変更せずに確認する場合は、git config -l(現在の構成を一覧表示する-ローカルとグローバルの両方を確認)
Krzysztof Bociurko

23

すでにchmodコマンドを使用している場合は、ファイルの違いを確認します。次のような以前のファイルモードと現在のファイルモードが表示されます。

新しいモード:755

古いモード:644

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

sudo chmod 644 .

コマンドを使用して、または手動で、設定ファイルでcore.fileModeをfalseに設定します。

git config core.fileMode false

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

sudo chmod 755 .

また、core.fileModeをtrueに設定します。

git config core.fileMode true

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


プロジェクト全体(開発、ステージング、およびプロダクション)を755にする必要があるとおっしゃっていますか?
ダニエル

@ダニエル2月:いいえ。必要なファイルのモードのみを変更します。
Kishor Vitekar 2016

For best practises don't Keep core.fileMode false alwaysどういう意味ですか、それを説明すべきです。
bg17aw 2016年

For best practises don't Keep core.fileMode false always.一部のファイルシステム(FATなど)はファイルのアクセス許可をサポートしていないため、OSはデフォルト値(とにかく私のシステムでは766)を報告します。この場合、core.filemodeローカル構成では絶対に必要ですが、不要で意図的でない権限の変更でコミット履歴を
膨らま

また、なぜパーマを元に戻すのが面倒なのですか?設定するとcore.filemode=false、gitは実行ビットの変更を無視します。ローカルのアクセス許可を変更する必要はありません。インデックスへのアクセス許可の変更を既に追加していない場合を除き、その場合、をgit addオフにした後に必要な手順がありませんcore.filemode
KevinOrr

18

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

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

このエイリアスの前にgitコマンドを付けると、ファイルモードの変更は、それ以外の場合に表示されるコマンドでは表示されません。例えば:

git nfm status

14

設定ファイル(サブモジュールを含む)でfilemodeをfalseに設定する場合: find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'


4
その行が構成ファイルにない場合、これは機能しません。:あなたがサブモジュールのためにそれを変更したい場合は、この試すgit submodule foreach git config core.fileMode false
courtlandj

4

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

プロジェクトフォルダーでこの単純なコマンドを押します(元の変更は削除されません) ... プロジェクトフォルダーの権限を変更しているときに行われた変更のみが削除ます

コマンドは以下の通りです:

git config core.fileMode false

このすべての不要なファイルが変更される 理由コマンドsudo chmod -R 777 ./yourProjectFolderでプロジェクトフォルダーの権限を変更したため

いつ変更を確認しますか。あなたはgit diff filenameを使用しているときに以下のように見つかりました

old mode 100644
new mode 100755

1

これは私にとってはうまくいきます:

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

またはオペレーティングシステムに応じて逆

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

1
これはファイルの権限を変更しますが、gitにファイルのファイル権限を無視させません。
domdambrogia

さて、あなたは正しいです、それはgit無視事を解決しません。
Martin Volek、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.