Make a file executable in Git

I make it a habit to ignore all file permission changes in Git, but sometimes I need to make a script executable. This is how I change the permissions on a file in such a way that they're stored in the repo.

I don't like Git storing file permission changes. Sometimes I want to make a whole folder wide open for testing locally, or a Composer install will install files with permissions that are too broad. I don't want the file permissions to change from their default states, so I use the following Git config to ignore filemode changes:

$ git config --global core.filemode false

# Check the config...
$ cat ~/.gitconfig
...snip...
[core]
  filemode = false

This ensures that if any permissions of files in my repository change, they don't get committed back to the central repo.

But sometimes I want a script to be executable on the server (for example, when using Acquia's build hooks to automate post-deployment tasks). That requires a permission change.

To do that, you can use Git's update-index command:

# Should show that the file permissions of the file are 100644.
$ git ls-files --stage

# Add 'executable' to the script.
$ git update-index --chmod=+x path/to/script.sh

# Should show that the file permissions are 100755.
$ git ls-files --stage

And then you can commit your changes, push them back to your repo, and carry on with your workflow.