GITのファイルにchmod権限を追加するにはどうすればよいですか?


182

.shファイルをgit commitしたいが、別のサーバーで同じファイルをチェックアウトしたときに実行可能になりたい。

ファイルをチェックアウトするサーバーでそのファイルを手動でchmod u + xせずにそうする方法はありますか?

回答:


291

公式ドキュメントによると、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

test.sh、git commit、push、別のサーバーでのチェックアウトを行うと、そのファイルの権限は次のようになります。-rw-rw-r-- 1 user user 12 Dec 5 11:42 test.sh
Henleyちゅ

リポジトリの1つでテストを実行したところ、期待どおりに動作しました。権限は、Windowsで提供されたコマンドを使用してファイルに設定されました。私のサーバー(Debian)の1つで、ファイルには以前-rw-r--r--権限がありましたが、現在は-rwxr-xr-xに設定されています。ローカルマシンとリモートマシンでどのgitバージョンを使用していますか?
Antwane

私のローカルではgitバージョン1.9.5、チェックアウトを行うサーバーではgit 1.7.1。
Henley Chiu

git 1.7.10を使用して別の(古い)サーバーでクローンを作成しようとしたところ、まだ正常に機能しており、ファイルにx権限があります。おそらく、ある時点で間違いを犯したか、リモートサーバーにクローンを作成したユーザーに権限の問題がある可能性があります
Antwane

変更(設定またはクリア)できるのは実行権限のみです。Gitは他の権限(読み取りまたは書き込み権限など)を追跡しません。
ダンアンダーソン

25

Antwaneの答えは正しいです。これはコメントであるはずですが、コメントには十分なスペースがなく、フォーマットを許可していません。:-) Gitに追加したいのですが、ファイルのアクセス許可は1または(スペル)として1だけ記録されます(および; 部分は「通常のファイル」を意味します):644755100644100755100

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日付けです。


「Gitの初期のバージョン」これの影響を受ける正確なバージョンは何か?
user5359531

2
コミット前の@ user5359531バージョンe44794706eeb57f2ee38ed1604821aa38b8ad9d2、つまりGitバージョン0.99より前のバージョン。
トレック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.