Bagaimana cara menambahkan izin chmod ke file di GIT?

182

Saya ingin git melakukan file .sh, tetapi ingin dieksekusi ketika saya checkout file yang sama di server lain.

Apakah ada cara untuk melakukannya tanpa chmod u + x file secara manual di server yang checkout file?

Henley Chiu
sumber

Jawaban:

291

Menurut dokumentasi resmi , Anda dapat mengatur atau menghapus bendera "executable" pada file apa pun yang dilacak menggunakan update-indexsub-perintah.

Untuk mengatur bendera, gunakan perintah berikut:

git update-index --chmod=+x path/to/file

Untuk menghapusnya, gunakan:

git update-index --chmod=-x path/to/file

Dibawah tenda

Meskipun ini tampak seperti sistem izin file unix biasa, sebenarnya tidak. Git mempertahankan "mode" khusus untuk setiap file dalam penyimpanan internalnya:

  • 100644 untuk file biasa
  • 100755 untuk yang dapat dieksekusi

Anda dapat memvisualisasikannya menggunakan ls-filesub - perintah, dengan --stageopsi:

$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh

Secara default, ketika Anda menambahkan file ke repositori, Git akan mencoba untuk menghormati atribut filesystem-nya dan mengatur filemode yang benar sesuai. Anda dapat menonaktifkan ini dengan menetapkan core.fileModeopsi ke false:

git config core.fileMode false

Penyelesaian masalah

Jika pada beberapa titik filemode Git tidak diset tetapi file memiliki flag sistem file yang benar, cobalah untuk menghapus mode dan atur lagi:

git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file

Bonus

Dimulai dengan Git 2.9, Anda bisa membuat file DAN mengatur flag dalam satu perintah:

git add --chmod=+x path/to/file
Antwane
sumber
Ketika saya melakukan itu untuk test.sh, git melakukan dan mendorong, dan checkout di server lain, ini adalah izin dari file itu: -rw-rw-r-- 1 pengguna pengguna 12 Des 5 11:42 test.sh
Henley Chiu
Saya baru saja melakukan tes pada salah satu repositori saya dan berfungsi seperti yang diharapkan. Izin ditetapkan pada file menggunakan perintah yang disediakan di bawah Windows. Di salah satu server saya (Debian) file tersebut memiliki izin -rw-r - r-- sebelumnya, sekarang disetel ke -rwxr-xr-x. Versi git apa yang Anda gunakan pada mesin lokal dan jarak jauh?
Antwane
git versi 1.9.5 di lokal saya, dan git 1.7.1 di server melakukan checkout.
Henley Chiu
Hanya mencoba mengkloning server lain (yang lebih lama) dengan git 1.7.10, masih berfungsi dengan baik, file tersebut memiliki x izin. Mungkin Anda membuat kesalahan di beberapa titik, atau Anda memiliki masalah izin dengan pengguna yang dikloning di server jauh
Antwane
Perhatikan bahwa Anda hanya dapat mengubah (mengatur atau menghapus) eksekusi izin. Git tidak melacak izin lainnya (seperti izin baca atau tulis).
Dan Anderson
25

Jawaban Antwane benar, dan ini harus berupa komentar tetapi komentar tidak memiliki cukup ruang dan tidak mengizinkan pemformatan. :-) Saya hanya ingin menambahkan bahwa di Git, izin file dicatat hanya 1 sebagai salah satu 644atau 755(dieja ( 100644dan 100755; 100bagian itu berarti "file biasa"):

diff --git a/path b/path
new file mode 100644

Yang pertama — 644 — berarti bahwa file tidak boleh dieksekusi, dan yang terakhir berarti harus dieksekusi. Bagaimana itu berubah menjadi mode file aktual dalam sistem file Anda agak tergantung pada OS. Pada sistem mirip Unix, bit dilewatkan melalui umaskpengaturan Anda , yang biasanya akan 022menghapus izin menulis dari "grup" dan "lainnya", atau 002untuk menghapus izin menulis hanya dari "lain". Mungkin juga 077jika Anda sangat peduli tentang privasi dan ingin menghapus membaca, menulis, dan mengeksekusi izin dari "grup" dan "lainnya".


1 Versi Git yang sangat awal memiliki izin grup yang disimpan, sehingga beberapa repositori memiliki entri pohon dengan mode 664di dalamnya. Modern Git tidak, tetapi karena tidak ada bagian dari objek apa pun yang dapat diubah, bit izin lama itu masih bertahan di objek pohon tua.

Perubahan untuk menyimpan hanya 0644 atau 0755 dalam komit e44794706eeb57f2 , yang sebelum Git v0.99 dan tanggal 16 April 2005.

torek
sumber
"Versi awal Git" ada ide yang versi tepatnya dipengaruhi oleh ini?
user5359531
2
@ versi pengguna5359531 sebelum melakukan e44794706eeb57f2ee38ed1604821aa38b8ad9d2, yaitu, mendahului Git versi 0.99.
torek