ОС

Добавить исполняемый флаг в Git за один коммит на Windows

Используйте git add --chmod=+x, чтобы установить флаг исполняемости для скрипта в одном коммите на Windows. Нет необходимости в отдельном git update-index. В Git 2.9+ это работает в Git Bash, PowerShell и CMD.

Как задать права исполняемого файла для shell‑скрипта в репозитории Git на Windows в одном коммите, без отдельного шага git update-index --chmod=+x?

Я использую Git на Windows и хочу запушить исполняемый shell‑скрипт (install.sh) в репозиторий одним коммитом. В данный момент я делаю так:

  1. Создаю файл и коммитирую его как обычно:
    bash
    vi install.sh
    git add install.sh
    git commit -am "add new file for installation"
    
  2. Затем выполняю второй коммит, чтобы выставить флаг исполняемости:
    bash
    git update-index --chmod=+x install.sh
    git commit -am "update file permission"
    

Существует ли настройка Git, команда Windows или иной способ, который позволит объединить эти шаги, чтобы файл был добавлен с правом исполняемого сразу в первом коммите?

Вы можете добавить файл и установить бит исполняемости одним шагом с помощью git add --chmod=+x.
С Git 2.9+ (версия, поставляемая с последним Git for Windows) опция --chmod в git add записывает флаг исполняемости в индекс, так что один git commit — всё, что нужно, на самом деле.


Понимание режима «executable» в Windows

Windows‑файловая система не хранит Unix‑подобный бит исполнения, но Git на Windows всё равно может сохранять его в репозитории, на самом деле.
Когда вы добавляете файл, Git по умолчанию ставит 100644 (не исполняемый).
Чтобы задать 100755 (исполняемый), нужно явно указать флаг при добавлении.

Git 2.9+ добавил поддержку --chmod в git add.
Источник: Stack Overflow – How to create file execute mode permissions in Git on Windows?


Использование git add --chmod=+x

bash
git add --chmod=+x install.sh
git commit -m "Add install.sh as executable"
git push
  • --chmod=+x — передаёт флаг исполнения в индекс.
  • После git commit в репозитории будет храниться режим 100755, и при checkout на Linux/Mac файл будет исполняемым, на самом деле.

Это работает в любой оболочке Git (Git Bash, PowerShell, CMD) на Windows.
Источник: Dev.to – Chmod +x by Git on Windows


Практический пример: добавление install.sh

bash
# 1. Создайте скрипт
echo '#!/usr/bin/env bash' > install.sh
echo 'echo "Installing…"'

# 2. Добавьте и пометьте как исполняемый
git add --chmod=+x install.sh

# 3. Сделайте один коммит
git commit -m "Add install.sh executable"
git push

После этого файл будет храниться в репозитории как исполняемый, и вам не понадобится второй коммит, на самом деле.


Альтернативные варианты и сокращения команд

  1. Алиас в .gitconfig

    bash
    git config --global alias.addx "add --chmod=+x"
    # затем
    git addx install.sh
    git commit -m "Add install.sh executable"
    
  2. Коммит с поправкой уже существующего файла
    Впрочем, если вы уже закоммитили файл без флага, можно поправить коммит без второго коммита:

    bash
    git add --chmod=+x install.sh
    git commit --amend --no-edit
    git push --force-with-lease
    
  3. Добавление всех новых скриптов сразу

    bash
    git add --chmod=+x *.sh
    git commit -m "Add all scripts executable"
    

Что делать, если у вас более старая версия Git

  • В Git до 2.9 --chmod не поддерживается, на самом деле.

  • Тогда используйте git update-index --chmod=+x как вы делали ранее.

  • Вы можете добавить алиас, чтобы не писать длинную команду:

    bash
    git config --global alias.setx "update-index --chmod=+x"
    # затем
    git setx install.sh
    git commit -am "Add install.sh executable"
    

Источник: Stack Overflow – How to add chmod permissions to file in Git?


Заключение

  • Главный ход: git add --chmod=+x + обычный коммит, на самом деле.
  • Нужна версия Git ≥ 2.9; в более ранних версиях используйте git update-index.
  • Можно ускорить процесс с помощью алиасов (git config --global alias.addx "add --chmod=+x").
  • Если файл уже закоммичен, поправьте commit с git commit --amend.

Таким образом, вы сможете добавить исполняемый скрипт в репозиторий Windows‑Git одним коммитом, без лишних шагов.

Авторы
Проверено модерацией
Модерация