Подтвердить что ты не робот

Автоматически применять "git update-index -chmod = + x" к исполняемым файлам

Я часто добавляю сценарии bash в мой репозиторий git, а сценарии имеют исполняемые разрешения в файловой системе Linux до git add. Но после нажатия добавленных файлов в удаленный репозиторий и вытаскивания в другом месте файлы отображаются с невыполнимаемыми разрешениями. Кажется, есть два способа исправить проблему:

1. chmod u+x $script 
   git commit -am "fixing the script permissions... again..."

или

2. git update-index --chmod=+x $script

Вместо того, чтобы каждый раз устанавливать разрешения, есть ли способ иметь git просто посмотреть права доступа к файлу на script во время git add, признать, что "эй, вот это исполняемый файл!" и добавить его в репозиторий с помощью внешних разрешений?

4b9b3361

Ответ 1

Существует несколько способов сделать это.

  • Git псевдонимы
  • Bash псевдонимы
  • Или даже объединить bash и git псевдонимы
  • Git псевдонимы

    Вы всегда можете использовать bash в своем псевдониме git.

    • Откройте конфигурацию git:

      vim ~/.gitconfig

    • Добавьте к нему секцию псевдонимов (если ее не существует):

      [alias]
          addscr = !sh -c 'if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x $0; git add $0'
      
  • Bash псевдонимы

    • Измените файл профиля bash:

      vim ~/.bashrc

    • Добавьте это в конец файла:

      function gitadd(){
          if [[ ${1: -3} == ".sh" ]]
              then git update-index --chmod=+x $1
          fi
          git add $1
       }
       alias gitadd='gitadd'
      
  • Объединить git и bash псевдонимы

    • Измените файл профиля bash:

      vim ~/.bashrc

    • Добавьте это в конец файла:

      function checkShellFile(){
          return ${1: -3} == ".sh"
      }
      alias gitadd='checkShellFile ? git addsrcipt "$1" : && git add "$1"'
      
    • Отредактируйте конфигурационный файл git:

      vim ~/.gitconfig

    • Добавьте к нему секцию псевдонимов (если ее не существует):

      [alias]
          addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0'
      

Ни одно из указанных выше не было протестировано

Ответ 2

git 2.9.X/2.10 (Q3 2016) приносит chmod до git add себя!

См. commit 4e55ed3 (31 мая 2016 г.) Эдвард Томсон (ethomson).
Помог: Йоханнес Шинделин (dscho).
(слияние Junio ​​C Hamano - gitster - в commit c8b080a, 06 июля 2016 г.

add: добавить --chmod=+x/--chmod=-x параметры

исполняемый бит не будет обнаружен (и, следовательно, не будет set) для путей в репозитории с core.filemode установлено значение false, хотя пользователи по-прежнему могут добавлять файлы в качестве исполняемых файлов для совместимость с другими пользователями, у которых есть core.filemodeфункциональность.
Например, пользователи Windows, добавляющие сценарии оболочки, могут захотеть добавить их как исполняемые файлы для совместимости с пользователями на не-Windows.

Хотя это можно сделать с помощью команды сантехника (git update-index --add --chmod=+x foo), преподавание команды git-add позволяет пользователям устанавливать исполняемый файл с помощью команды, которую они уже знакомы с.

Вы можете увидеть происхождение этой новой функции в разделе Как создать разрешения режима выполнения файла в Git в Windows?" (февраль 2011 г.)

Ответ 3

Вот script для автоматического применения "git update-index -chmod + x" к исполняемым файлам:

for f in `find . -name '*.sh' -o -regex './s?bin/[^/]+' -o -regex './usr/sbin/[^/]+' -o -regex './usr/lib/[^/]+' `;do
 ( cd `dirname $f` && git update-index --chmod=+x  `basename $f` )
done 

Ответ 4

Решение без фантазии bash scripting:

  • Установите fileMode = true в ваш .git/config файл (или запустив git config core.filemode true, как указывали другие)
  • Измените исполняемый бит на разрешениях файла и зафиксируйте это изменение. (chmod u+x $script, как вы указали). Вам нужно сделать это только один раз.
  • Нажмите на пульте дистанционного управления

В следующий раз, когда вы отталкиваетесь оттуда, git установит фиксированный исполняемый бит в файле. У меня также были схожие проблемы, они решили их.

fileMode = true сообщает git отслеживать единственное, что разрешает ему: исполняемый бит. Это означает, что изменения в исполняемом бите будут распознаны git как изменения в рабочем дереве, и эти изменения будут сохранены в репо с последующим фиксацией.

После того, как вы установили желаемый исполняемый бит, вы также можете reset ваш fileMode до false, поэтому в следующий раз git не будет беспокоить вас такими изменениями, когда вы не хотите их комментировать.

Ответ 5

Я не думаю, что это можно сделать с помощью команды git add, но вы можете запустить script сразу после запуска команды git commit, но до того, как будет создана фиксация.

Взгляните на крюк предварительной фиксации.

http://git-scm.com/book/en/Customizing-Git-Git-Hooks

В принципе просто создайте файл в вашей .git/hooks/папке, которая называется pre-commit. (Там должны быть образцы уже в папке ваших крючков, переименуйте их, чтобы удалить ".sample" в конце, чтобы активировать его.)

Вот что. Убедитесь, что ваш script запускает git stash -q первым, чтобы вы работали над фактическими поэтапными версиями файлов.

Ответ 6

Я только что добавил обновление папки "Черепаха Git". Щелкните правой кнопкой мыши по всем файлам и установите флажок "Разрешение на выполнение" на true и передайте/отправьте сообщение. Git Командная строка add/commit также должна работать.