Bagaimana cara membuat izin mode eksekusi file di Git pada Windows?

378

Saya menggunakan Git di Windows, dan ingin mendorong skrip shell yang dapat dieksekusi ke git repo oleh satu komit.

Biasanya saya perlu melakukan dua langkah ( git commit).

$ vi install.sh
$ git add install.sh  
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
 1 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
  0 files changed
  mode change 100644 => 100755 install.sh

Bagaimana saya bisa menggabungkan kedua langkah ini menjadi satu langkah? konfigurasi git? perintah windows?

Ingatkan : Dua jawaban baik, git add --chmod=+x filedidukung dalam versi git baru

Referensi: lihat pertanyaan dalam izin file Git pada Windows untuk komit kedua

Larry Cai
sumber
10
Dengan git 2.9.x / 2.10 (Q3 2016), git add --chmod=+xsebenarnya mungkin. Lihat jawaban saya di bawah ini , penghargaan untuk Edward Thomson .
VonC
5
Akan layak memperbarui jawaban yang dipilih untuk git add --chmod=+xversi
mikemaccana

Jawaban:

591

Tidak perlu melakukan ini dalam dua komit, Anda dapat menambahkan file dan menandainya dapat dieksekusi dalam satu komit:

C:\Temp\TestRepo>touch foo.sh

C:\Temp\TestRepo>git add foo.sh

C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Seperti yang Anda perhatikan, setelah menambahkan, mode adalah 0644 (yaitu, tidak dapat dieksekusi). Namun, kami dapat menandainya sebagai executable sebelum melakukan:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh

C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Dan sekarang file tersebut adalah mode 0755 (dapat dieksekusi).

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 foo.sh

Dan sekarang kita memiliki satu komit dengan satu file yang dapat dieksekusi.

Edward Thomson
sumber
147

Memang, alangkah baiknya jika git-addmemiliki --modebendera

git 2.9.x / 2.10 (Q3 2016) sebenarnya akan memungkinkan itu (terima kasih kepada Edward Thomson ):

git add --chmod=+x -- afile
git commit -m"Executable!"

Itu membuat semua proses lebih cepat, dan bekerja bahkan jika core.filemodedisetel ke false.

Lihat komit 4e55ed3 (31 Mei 2016) oleh Edward Thomson ( ethomson) .
Dibantu-oleh: Johannes Schindelin ( dscho) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit c8b080a , 06 Jul 2016)

add: tambahkan --chmod=+x/ --chmod=-xopsi

Bit executable tidak akan terdeteksi (dan karena itu tidak akan set) untuk jalur dalam repositori dengan core.filemodeset ke false, meskipun pengguna mungkin masih ingin menambahkan file sebagai executable untuk kompatibilitas dengan pengguna lain yang melakukan memiliki core.filemode fungsi.
Misalnya, pengguna Windows yang menambahkan skrip shell mungkin ingin menambahkannya sebagai executable untuk kompatibilitas dengan pengguna di non-Windows.

Meskipun ini bisa dilakukan dengan perintah plumbing ( git update-index --add --chmod=+x foo), mengajarkan git-addperintah memungkinkan pengguna untuk mengatur file yang dapat dieksekusi dengan perintah yang sudah mereka kenal .

VONC
sumber
22

Jika file sudah memiliki flag + x yang ditetapkan, git update-index --chmod=+xtidak melakukan apa-apa dan git berpikir tidak ada yang harus dikomit, meskipun flag tidak disimpan ke dalam repo.

Pertama-tama Anda harus menghapus flag, menjalankan perintah git, lalu mengembalikan flag:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

kemudian git melihat perubahan dan akan memungkinkan Anda untuk melakukan perubahan.

Bohemian
sumber
10

Catatan itu pertama-tama Anda harus yakin tentang filemodediatur ke falsedalam file config git, atau gunakan perintah ini:

git config core.filemode false

dan kemudian Anda dapat mengatur izin 0777 dengan perintah ini:

git update-index --chmod=+x foo.sh
Nabi KAZ
sumber
3

Saya tidak punya touchdan chmodperintah di cmd.exe saya dangit update-index --chmod=+x foo.sh tidak bekerja untuk saya.

Saya akhirnya menyelesaikannya dengan mengatur skip-worktreebit:

git update-index --skip-worktree --chmod=+x foo.sh
khiav reoy
sumber