Izin file git di Windows

173

Saya sudah membaca beberapa pertanyaan tentang izin file di Git dan saya masih agak bingung. Saya punya repo di GitHub yang bercabang dari yang lain. Pasca menggabungkan, mereka harus identik. Namun:

$ git diff --summary origin/epsilon master/epsilon
 mode change 100644 => 100755 ants/dist/sample_bots/csharp/compile.sh
 mode change 100644 => 100755 ants/dist/starter_bots/coffeescript/MyBot.coffee
 mode change 100644 => 100755 ants/dist/starter_bots/coffeescript/ants.coffee
 mode change 100644 => 100755 ants/util/block_test.sh
 mode change 100644 => 100755 manager/mass_skill_update.py
 mode change 100644 => 100755 worker/jailguard.py
 mode change 100644 => 100755 worker/release_stale_jails.py
 mode change 100644 => 100755 worker/start_worker.sh

Saya sudah mencoba mengubah izin file, tetapi tidak mengubah hasil diff.

Synesso
sumber

Jawaban:

347

Saya menemukan solusi bagaimana mengubah izin (juga) di Windows di sini: http://blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html

Sebagai contoh, perintah berikut menambahkan izin eksekusi pengguna ke file arbitrer:

git update-index --chmod=+x <file>
dedek
sumber
6
+1: persis apa yang saya butuhkan untuk memastikan skrip shell yang saya komit dari Windows (di mana saya telah core.filemodemengatur untuk false) benar-benar memiliki bit set eksekusi.
tomlogic
Dalam kasus saya, saya juga menambahkan baris baru ke file, dan baru kemudian dapat melakukan
oshai
5
Pada Windows, menggunakan git-bash, aku butuh --addbendera untuk eksekusi untuk beberapa alasan: git update-index --add --chmod=+x <file>. Setelah ini, file sudah di atas panggung dengan chmod
Jefferson Quesado
Tidak memiliki efek lagi, baik di git bash maupun di cmd.exe prompt.
Ben
107

Dari pertanyaan lain di sini di stackoverflow: Bagaimana cara saya membuat Git abaikan file mode (chmod) berubah?

Mencoba:

git config core.filemode false

Dari git-config (1) :

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.
Corey Henderson
sumber
Terima kasih. Saya juga melihatnya. Mencobanya dan tidak ada bedanya.
Synesso
3
Saya memiliki masalah yang mirip dengan OP dan tidak dapat melakukan perubahan tidak peduli bagaimana hardsaya mencoba mengatur ulang. Ini berhasil bagi saya.
Jo-Herman Haugholt
11
[project] /. git / config dapat berisi pengaturan yang sama dan akan menimpa ~ / .gitconfig. Jika Anda mencoba mengaturnya secara global, pastikan itu tidak diganti secara lokal.
Binary Phile
1
Saya menemukan ini perlu pada NTFS juga, sayangnya.
Marc.2377
1
Itu jawabannya!
Andrew Surdu
29

Satu-liner berguna untuk Git Bash:

find . -name '*.sh' | xargs git update-index --chmod=+x

Ini akan menandai semua .shfile sebagai executable. Setelah itu, Anda hanya perlu git commit.

Benoit Blanchon
sumber
2
Koreksi kecil untuk @ benoit-blanchon one-liner ... .sh harus dikutip. Temukan . -nama ' .sh' | xargs git update-index --chmod = + x
Steven yang Mudah Dihibur
Anda benar, saya mengedit jawabannya. Terima kasih @SteventheEasilyAmused.
Benoit Blanchon
15

Jika Anda menggunakan Cygwin git (atau Linux git juga, saya kira), ada kemungkinan besar pengaturan core.filemode Anda telah ditetapkan pada tingkat proyek dalam $ projdir / .git / config. Saya menemukan bahwa saya harus melakukan yang berikut untuk mendapatkan Cygwin git dan Windows git saya untuk hidup berdampingan dengan baik pada sistem file Windows tanpa perubahan filemode yang tidak ada yang muncul setiap saat:

  • hapus baris pengaturan core.filemode di $ projdir / .git / config
  • di Windows git, jalankan "git config --global core.filemode false"

Ini memungkinkan Cygwin git saya untuk terus melihat perubahan filemode, yang biasanya relevan, sementara memerintahkan Windows git untuk mengabaikan perubahan filemode yang dilihatnya, yang biasanya positif palsu.

skiphoppy
sumber
6

Pertama periksa izin file menggunakan perintah di bawah ini.

git ls-files --stage

Kemudian ubah izin. Di sini "x" mewakili izin eksekusi.

git update-index --chmod=+x 'scriptname.ext'

Sekarang verifikasi ulang izinnya.

git ls-files --stage

============================================

jika Anda menggunakan PC Windows, tetapi menggunakan mesin linux. Jalankan perintah di bawah ini di tempat pertama untuk membuatnya kompatibel untuk dijalankan di mesin linux

dos2unix scriptname.ext scriptname.ext

Sireesh Yarlagadda
sumber
Apakah tidak ada cara untuk melakukan sesuatu seperti itu git update-index --chmod=1777 'scriptname.ext'?
Alex Barker
Apakah Anda menavigasi ke jalur, tempat file skrip ada? @ Alex
Sireesh Yarlagadda
5

Saya memperbaikinya dengan mengubah izin file di Ubuntu, melakukan, mendorong, dan semua OK. Tampaknya itu tidak akan berfungsi dengan msysgit di Windows / NTFS.

Synesso
sumber
Saya dapat merekomendasikan GitHub untuk windows. Antarmuka yang luar biasa dan shell yang sangat bagus, saya bahkan membuat setup kunci ssh relatif mudah dan menginstal git flow.
Sangoku