Как мне изменить Git игнорировать режим файла (chmod)?

У меня есть проект, в котором я должен изменить режим файлов с chmod до 777 при разработке, но который не должен меняться в основном репо.

Git выбирает chmod -R 777 . и отмечает все измененные файлы. Есть ли способ сделать изменения режима Git игнорирования, которые были сделаны в файлах?

Ответ 1

Попробуйте:

git config core.fileMode false

Из git-config (1):

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

Флаг -c можно использовать для установки этой опции для одноразовых команд:

git -c core.fileMode=false diff

А флаг --global сделает его поведение по умолчанию для вошедшего в систему пользователя.

git config --global core.fileMode false

Изменения глобального параметра не будут применены к существующим репозиториям. Кроме того, git clone и git init явно задают core.fileMode значение true в конфигурации репозитория, как обсуждалось в Git global core.fileMode false, локально переопределяемом для клона

Предупреждение

core.fileMode не является лучшей практикой и должен использоваться осторожно. Этот параметр охватывает только исполняемый бит режима и никогда не считывает/записывает биты. Во многих случаях вы думаете, что вам нужен этот параметр, потому что вы сделали что-то вроде chmod -R 777, сделав все ваши файлы исполняемыми. Но в большинстве проектов большинство файлов не нужны и не должны быть исполняемыми по соображениям безопасности.

Правильный способ решения подобной ситуации - отдельно обрабатывать права доступа к папкам и файлам, например:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

Если вы сделаете это, вам никогда не понадобится использовать core.fileMode, кроме как в очень редких условиях.

Ответ 2

изменение режима отмены в рабочем дереве:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

Или в mingw- git

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

Ответ 3

Если вы хотите установить этот параметр для всех своих репозиториев, используйте параметр --global.

git config --global core.filemode false

Если это не работает, возможно, вы используете более новую версию git, поэтому попробуйте параметр --add.

git config --add --global core.filemode false

Если вы запустите его без опции -global, и ваш рабочий каталог не является репо, вы получите

error: could not lock config file .git/config: No such file or directory

Ответ 4

Если

git config --global core.filemode false

не работает для вас, сделайте это вручную:

cd into yourLovelyProject folder

cd в папку .git:

cd .git

отредактируйте файл конфигурации:

nano config

изменить true на false

[core]
        repositoryformatversion = 0
        filemode = true

- >

[core]
        repositoryformatversion = 0
        filemode = false

сохранить, выйти, перейти в верхнюю папку:

cd ..

повторно введите git

git init

все готово!

Ответ 5

Добавление к ответу Грега Хьюгилла (об использовании переменной конфигурации core.fileMode):

Вы можете использовать --chmod=(-|+)x в git update-index (низкоуровневая версия "git add"), чтобы изменить разрешения на выполнение в индексе, откуда он будет выбран, если вы используете "git". commit "(а не" git commit -a ").

Ответ 6

Вы можете настроить его глобально:

git config --global core.filemode false

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

Удалите локальную конфигурацию, чтобы глобальная конфигурация вступила в силу:

git config --unset core.filemode

В качестве альтернативы вы можете изменить свою локальную конфигурацию на правильное значение:

git config core.filemode false

Ответ 7

Если вы уже использовали команду chmod, то проверьте разницу в файле. Он показывает предыдущий режим файла и текущий режим файла, например:

новый режим: 755

старый режим: 644

установить старый режим для всех файлов, используя команду

sudo chmod 644 .

теперь установите core.fileMode в false в файле конфигурации либо с помощью команды, либо вручную.

git config core.fileMode false

затем примените команду chmod для изменения разрешений для всех файлов, таких как

sudo chmod 755 .

и снова установите для параметра core.fileMode значение true.

git config core.fileMode true

Для лучшей практики не всегда сохраняйте core.fileMode false.

Ответ 8

Определив следующий псевдоним (в ~/.gitconfig), вы можете легко временно отключить команду fileMode per git:

[alias]
nfm = "!f(){ git -c core.fileMode=false [email protected]; };f"

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

git nfm status

Ответ 9

Если вы хотите установить filemode в false в конфигурационных файлах рекурсивно (включая подмодули): find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'

Ответ 10

Простое решение:

Нажмите эту простую команду в папке проекта (она не удалит ваши исходные изменения)... она только удалит изменения, которые были сделаны пока вы изменили разрешение папки проекта

Команда ниже:

git config core.fileMode false

Почему все эти ненужные файлы модифицируются: потому что вы изменили права доступа к папке проекта с похвалой sudo chmod -R 777./yourProjectFolder

когда вы будете проверять изменения, что не вы сделали? вы нашли, как показано ниже, при использовании git diff filename

old mode 100644
new mode 100755

Ответ 11

Это работает для меня:

find . -type f -exec chmod a-x {} \;

или наоборот, в зависимости от вашей операционной системы

find . -type f -exec chmod a+x {} \;

Ответ 12

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

git reset HEAD --hard

после этого будет reset предыдущей фиксации.