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?
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?
Jawaban:
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 biasa100755 untuk yang dapat dieksekusiAnda 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
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.
e44794706eeb57f2ee38ed1604821aa38b8ad9d2, yaitu, mendahului Git versi 0.99.