回答:
公式ドキュメントによると、update-index
サブコマンドを使用して、追跡されたファイルの「実行可能」フラグを設定または削除できます。
フラグを設定するには、次のコマンドを使用します。
git update-index --chmod=+x path/to/file
それを削除するには、以下を使用します。
git update-index --chmod=-x path/to/file
フードの下
これは通常のUNIXファイル許可システムのように見えますが、実際にはそうではありません。Gitは内部ストレージ内の各ファイルに対して特別な「モード」を維持しています。
100644
通常のファイルの場合100755
実行可能なものオプション付きのls-file
サブコマンドを使用してそれを視覚化でき--stage
ます。
$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0 .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0 my_executable_script.sh
デフォルトでは、ファイルをリポジトリに追加すると、Gitはそのファイルシステム属性を尊重し、それに応じて正しいファイルモードを設定しようとします。これを無効にするには、core.fileMode
オプションをfalseに設定します。
git config core.fileMode false
トラブルシューティング
ある時点でGitファイルモードが設定されていないが、ファイルに正しいファイルシステムフラグが設定されている場合は、モードを削除して再度設定してください。
git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file
ボーナス
Git 2.9以降では、ファイルをステージングし、1つのコマンドでフラグを設定できます。
git add --chmod=+x path/to/file
Antwaneの答えは正しいです。これはコメントであるはずですが、コメントには十分なスペースがなく、フォーマットを許可していません。:-) Gitに追加したいのですが、ファイルのアクセス許可は1または(スペル)として1つだけ記録されます(および; 部分は「通常のファイル」を意味します):644
755
100644
100755
100
diff --git a/path b/path
new file mode 100644
前者の644は、ファイルが実行可能であってはならないことを意味し、後者は、実行可能であることを意味します。それがファイルシステム内で実際のファイルモードになる方法は、OSによって多少異なります。Unixライクなシステムでは、ビットはumask
設定を通過します。これは通常022
、「グループ」と「その他」002
から書き込み権限を削除するか、「その他」からのみ書き込み権限を削除することです。また077
、プライバシーに特に懸念があり、「グループ」と「その他」の両方から読み取り、書き込み、および実行権限を削除したい場合もあります。
1 Gitの非常に初期のバージョンでは、グループのアクセス許可が保存されたため、一部のリポジトリにはモードが含まれるツリーエントリが含ま664
れています。最新のGitはそうではありませんが、オブジェクトのどの部分も変更することはできないため、これらの古い権限ビットは依然として古いツリーオブジェクトに残ります。
0644または0755のみを保管するための変更は、コミットe44794706eeb57f2にありました。これは、Git v0.99より前で、2005年4月16日付けです。
e44794706eeb57f2ee38ed1604821aa38b8ad9d2
、つまりGitバージョン0.99より前のバージョン。