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?
Menurut dokumentasi resmi , Anda dapat mengatur atau menghapus bendera "executable" pada file apa pun yang dilacak menggunakan update-index
sub-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 biasa100755
untuk yang dapat dieksekusiAnda dapat memvisualisasikannya menggunakan ls-file
sub - perintah, dengan --stage
opsi:
$ 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.fileMode
opsi 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
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
644
atau755
(dieja (100644
dan100755
;100
bagian itu berarti "file biasa"):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
umask
pengaturan Anda , yang biasanya akan022
menghapus izin menulis dari "grup" dan "lainnya", atau002
untuk menghapus izin menulis hanya dari "lain". Mungkin juga077
jika 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
664
di 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.
sumber
e44794706eeb57f2ee38ed1604821aa38b8ad9d2
, yaitu, mendahului Git versi 0.99.