Reputation: 50328
How do I update file permissions with git-bash
on Windows 7?
I've tried the following without success:
$ ls -al scripts/script.sh
-rw-r--r-- 1 myUid Administ 70 Sep 8 11:24 scripts/script.sh
$ git update-index --chmod=+x scripts/script.sh
$ ls -al scripts/script.sh
-rw-r--r-- 1 myUid Administ 70 Sep 8 11:24 scripts/script.sh
$ chmod +x scripts/script.sh
$ ls -al scripts/script.sh
-rw-r--r-- 1 myUid Administ 70 Sep 8 11:24 scripts/script.sh
Upvotes: 74
Views: 67247
Reputation: 808
Very likely you do not have "shebang" at the beginning of your script. So Windows does not know which binary should be used to run the script. Thus the permissions gets silently ignored.
For example:
#!/usr/bin/sh
or
#!/usr/bin/bash
It looks like git-bash detects it automaticly, because the executable attribute gets set even without chmod command. Moreover it is not possible to disable it by using chmod.
Upvotes: 13
Reputation: 29829
If you're updating scripts in a windows environment that are being deployed to a linux filesystem, even though they are permitted to run locally, you may still find yourself needing to grant execute before pushing.
From this article on Change file permissions when working with git repo's on windows:
.sh
file where you want to grant execute permissionsCheck the existing permissions with the following command:
git ls-files --stage
Which should return something like 100644
Update the permissions with the following command
git update-index --chmod=+x 'name-of-shell-script'
Check the file permission again
git ls-files --stage
Which should return something like 100755
Commit changes and push!
Upvotes: 71
Reputation: 9445
You are probably using NTFS or FAT32 on Windows, and those filesystems do not support the executable permission. Instead, cygwin looks at the file name and contents to determine whether it's executable:
Files are considered to be executable if the filename ends with .bat, .com or .exe, or if its content starts with #!.
So you should make sure that the bash file starts with a shebang (e.g. #!/bin/bash
). Then, you should be able to just execute the file, disregarding the permission output of ls
.
Upvotes: 108