Uprawnienia do plików Git w systemie Windows

172

Przeczytałem kilka pytań dotyczących uprawnień do plików w Git i nadal jestem trochę zdezorientowany. Mam repozytorium na GitHub rozwidlone z innego. Po scaleniu powinny być identyczne. Jednak:

$ 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

Próbowałem zmienić uprawnienia do plików, ale nie zmienia to wyników różnic.

Synesso
źródło

Odpowiedzi:

346

Znalazłem rozwiązanie, jak zmienić uprawnienia (również) w systemie Windows tutaj: http://blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html

Na przykład następujące polecenie dodaje uprawnienia użytkownika do wykonania dowolnego pliku:

git update-index --chmod=+x <file>
dedek
źródło
6
+1: dokładnie to, czego potrzebowałem, aby upewnić się, że skrypty powłoki, które wykonuję z systemu Windows (gdzie core.filemodeustawiłem false), faktycznie mają ustawiony bit wykonania.
tomlogic
W moim przypadku dodałem też nową linię do pliku i dopiero wtedy udało mi się zatwierdzić
oshai
5
W systemie Windows za pomocą git-bash, potrzebowałem --addflagę z realizacją jakiegoś powodu: git update-index --add --chmod=+x <file>. Po tym plik był już na etapie z chmod
Jefferson Quesado
Nie działa już ani w git bash, ani w zachęcie cmd.exe.
Ben
107

Z innego pytania na temat stackoverflow: Jak sprawić, by Git ignorował zmiany trybu plików (chmod)?

Próbować:

git config core.filemode false

Z 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
źródło
Dzięki. Ja też to widziałem. Próbowałem i to nie miało znaczenia.
Synesso,
3
Miałem podobne problemy do OP i nie mogłem wyciągnąć zmian bez względu na to, jak hardpróbowałem zresetować. To załatwiło sprawę dla mnie.
Jo-Herman Haugholt
11
[projekt] /. git / config może zawierać to samo ustawienie i nadpisuje ~ / .gitconfig. Jeśli próbujesz ustawić to globalnie, upewnij się, że nie jest zastępowane lokalnie.
Binary Phile
1
Uważam, że jest to również konieczne w NTFS, niestety.
Marc.2377
1
To jest odpowiedź!
Andrew Surdu
29

Poręczna jedna linijka do Git Bash:

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

Oznaczy wszystkie .shpliki jako wykonywalne. Potem po prostu musisz git commit.

Benoit Blanchon
źródło
2
Mała poprawka dla @ benoit-blanchon one-liner… .sh musi być zacytowany. odnaleźć . -name ' .sh' | xargs git update-index --chmod = + x
Steven the Easily Amused
Masz rację, zredagowałem odpowiedź. Dzięki @SteventheEasilyAmused.
Benoit Blanchon,
15

Jeśli używasz Cygwin git (lub Linux git, jak zakładam), istnieje duża szansa, że ​​ustawienie core.filemode zostało ustawione na poziomie projektu w $ projdir / .git / config. Zauważyłem, że muszę wykonać następujące czynności, aby mój Cygwin git i mój system Windows git dobrze współistniały w systemie plików Windows bez nieistniejących zmian w trybie pliku wyświetlanych przez cały czas:

  • usuń ustawienie linii core.filemode w $ projdir / .git / config
  • w Windows git, uruchom "git config --global core.filemode false"

Dzięki temu mój Cygwin git może nadal widzieć zmiany w trybie pliku, które zwykle są istotne, jednocześnie instruując git systemu Windows, aby zignorował zmiany w trybie pliku, które widzi, które zwykle są fałszywymi alarmami.

skiphoppy
źródło
6

Najpierw sprawdź uprawnienia do plików za pomocą poniższego polecenia.

git ls-files --stage

Następnie zmień uprawnienia. Tutaj „x” oznacza uprawnienia do wykonywania.

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

Teraz ponownie zweryfikuj uprawnienia.

git ls-files --stage

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

jeśli używasz komputera z systemem Windows, ale wdrażasz na komputerze z systemem Linux. Wykonaj poniższe polecenie w pierwszej kolejności, aby było kompatybilne z systemem Linux

dos2unix nazwa skryptu.ext nazwa skryptu.ext

Sireesh Yarlagadda
źródło
Czy nie ma sposobu, aby zrobić coś takiego git update-index --chmod=1777 'scriptname.ext'?
Alex Barker
Czy nawigujesz do ścieżki, w której znajduje się plik skryptu? @alex
Sireesh Yarlagadda
5

Naprawiłem to, zmieniając uprawnienia do plików w Ubuntu, zatwierdzanie, wypychanie i wszystko OK. Wygląda na to, że po prostu nie działałoby z msysgit na Windows / NTFS.

Synesso
źródło
Nie polecam GitHub dla Windows. Cudowny interfejs i naprawdę fajna powłoka, zrobiłem nawet stosunkowo łatwą konfigurację klucza ssh i instalację git flow.
Sangoku,