Як зробити так, щоб змінити режим файлу ігнорування Git (chmod)?


2308

У мене є проект, в якому мені доводиться змінювати режим файлів з chmodна 777 під час розвитку, але який не повинен змінюватися в основному репо.

Git підключається chmod -R 777 .і позначає всі файли як змінені. Чи є спосіб внести зміни в режим ігнорування Git, внесені до файлів?


17
Це корисно при роботі з git на Windows + Bash на Ubuntu в Windows
Elazar

4
Для тих , хто хоче просто ігнорувати зміни прав доступу для конкретного виклику git diff, і хто тому не хоче змінювати свої файли конфігурації Git: ви можете використовувати git diff -G.в Zed в відповідь тут .
sampablokuper

Відповіді:


3819

Спробуйте:

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 глобальної core.fileMode БРЕХНЯ переопределяется локально на клоні

Увага

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, за винятком дуже рідкісних умов.


203
Якщо це зробити, git config --global core.filemode falseвам потрібно буде зробити це лише один раз для всіх репостів.
Грег

13
це не спрацювало для мене, поки я не виправив випадок, це має бути fileMode замість filemode
tishma

8
@tishma: розділ конфігурації Git та назви змінних залежать від регістру відповідно до документації, дивіться розділ КОНФІГУРАЦІЙНИЙ ФАЙЛ , тож якщо вищезгадане не працювало для вас, то це було з іншої причини.
Грег Хьюгілл

11
@donquixote: git configКоманда записує налаштування у правильний конфігураційний файл ( .git/configлише для поточного сховища або ~/.gitconfigякщо використовується з --global).
Грег Хьюгілл

8
@ zx1986: Це не має значення. З конфігурації git : "Імена змінних не залежать від регістру, ..."
Грег Хьюгілл

277

зміни режиму скасування в робочому дереві:

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

42
У OS X Lion опустіть -d'\n'частину, xargsоскільки це незаконні аргументи (і не потрібні).
Паскаль

9
Ви можете ігнорувати будь-які помилки щодо "chmod: відсутній операнд після` + x ""
Casey Watson

5
це актуально? Я отримую "chmod: занадто мало аргументів" в mingw
hammett

7
@Pascal @pimlottc -d визначає роздільник, який повинен бути новим рядком, а не пробілом. BSD xargs не має такої опції, але замість цього ви можете передавати висновок через, tr '\n' '\0'а потім використовувати -0аргумент до xargs, щоб використовувати NUL як роздільник.
Марк Оффлік

10
Класно, trріч спрацювала! Ось повна команда для OSX:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
K.-Michael Aye,

135

Якщо ви хочете встановити цю опцію для всіх своїх репостів, використовуйте цю --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

5
Схоже, пізніше GIT використовує --add, як ingit config --add --global core.filemode false
mgaert

14
Якщо локальний конфігуратор репо вже має filemode = true, то зміна глобальної конфігурації не допоможе, оскільки локальна конфігурація перекриє глобальну конфігурацію. Доведеться один раз змінити локальну конфігурацію кожної машини машини
Rakib

3
ВАЖЛИВО: Оновіть цю відповідь попередженням syedrakib! Все, коли я знайшов це, божевільно почувався, і після цього я мав ідеальний сенс.
jerclarke

88

Якщо

git config --global core.filemode false

не працює для вас, зробіть це вручну:

cd into yourLovelyProject folder

CD у папку .git:

cd .git

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

nano config

змінити вірне на хибне

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

зберегти, вийти, перейти до верхньої папки:

cd ..

відновити git

git init

ви зробили!


11
Замість редагування .git/configдостатньо простого git config core.fileMode falseв корені вашого проекту. Якщо ви редагуєте конфігураційний файл, вам краще повністю видалити директиву, щоб отримати глобальний.
Фелікс

6
-1 якщо git config --global не працює, це означає, що ви не маєте дозволів робити це на системному рівні, видалення globalпараметра робить точно те саме, що і вручну редагувати .git / config
CharlesB

@CharlesB невірний - відповідь дав рішення, ввівши опцію безпосередньо в проект, зробивши його конкретним проектом. Це не працюватиме з іншими проектами git, які ви робите / оформляєте в майбутньому, але буде працювати для проекту, над яким ви працюєте. (давайте переконайтеся, що ми ~/.gitconfig~/project/.git/config
розійшлися

Як тільки це запуститься, чи git initслід повернути filemode до істинного?
Йорданія

53

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

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


2
Це мало бути відредаговано у відповіді Грега Хьюгілла, а не додано як окрему відповідь, таким чином створивши одну вищу відповідь з єдиним однозначним поданням.
Грег

6
@Greg: для редагування не власної відповіді потрібно мати достатньо балів; Я думаю, що мені не вистачало для редагування дозволів на той час.
Якуб Нарубський

1
@Jakub Я думаю, у вас зараз достатньо репутації :) Як виглядатиме ця команда у прикладі файлу?
Алекс Холл

38

Ви можете налаштувати його в усьому світі:

git config --global core.filemode false

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

Видаліть локальну конфігурацію, щоб глобальна конфігурація набула чинності:

git config --unset core.filemode

Крім того, ви можете змінити локальну конфігурацію на потрібне значення:

git config core.filemode false


4
Якщо основна відповідь вам не допомагає - спробуйте цю. Якщо ви хочете перевірити локальну конфігурацію, не змінюючи її, перевірте git config -l(перерахуйте поточну конфігурацію - як локальну, так і глобальну)
Krzysztof Bociurko

23

Якщо ви вже використовували команду 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

Для передового досвіду не зберігайте false.fileMode неправдивим завжди.


Ви хочете сказати, що весь проект (у розробці, постановці та виробництві) повинен становити 755?
Даніель

@Daniel Feb: Ні. Змінюйте режим лише необхідних файлів.
Кішор Вітекар

For best practises don't Keep core.fileMode false alwaysщо ви маєте на увазі, ви повинні пояснити це.
bg17aw

For best practises don't Keep core.fileMode false always.Деякі файлові системи (наприклад, FAT) не підтримують дозволи на файли, тому операційна система повідомляє про значення за замовчуванням (766 у моїй системі все одно). У цьому випадку core.filemodeце абсолютно необхідно в локальній конфігурації, якщо ви не хочете
розмивати історію комісій

Крім того, чому ви взагалі не турбуєтесь про зміну хімічних речовин? Якщо ви встановите, core.filemode=falsegit ігнорує виконання змін бітів, не потрібно змінювати локальні дозволи. Якщо ви вже не додали змін дозволу до індексу, у такому випадку ви пропускаєте крок, до якого потрібно буде git addпісля вимкнення core.filemode.
KevinOrr

18

Визначивши наступний псевдонім (у ~ / .gitconfig), ви можете легко тимчасово відключити fileMode за командою git:

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

Якщо цей псевдонім є префіксом для команди git, зміни режиму файлу не відображатимуться з командами, які б інакше їх показували. Наприклад:

git nfm status

14

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


4
Це не працюватиме, якщо цього рядка немає у конфігураційному файлі. Якщо ви хочете змінити його на підмодулі, спробуйте це:git submodule foreach git config core.fileMode false
courtlandj

4

Просте рішення:

Натисніть цю просту команду в папці проекту ( вона не видалить ваші початкові зміни) ... вона видалить лише зміни, які були зроблені під час зміни дозволу на папку проекту

команда нижче:

git config core.fileMode false

Чому цей непотрібний файл модифікується: адже ви змінили дозволи дозволу на папку проекту з похвалою sudo chmod -R 777 ./yourProjectFolder

коли ви перевірите зміни, чого не зробили? ви знайшли, як показано нижче, використовуючи ім'я файлу git diff

old mode 100644
new mode 100755

1

Це працює для мене:

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

або назад, залежно від вашої операційної системи

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

1
Це дозволило б змінити дозволи файлу, але не змусити git ігнорувати дозволи файлу.
domdambrogia

Що ж, ви праві, це не вирішує ігнорування речі git.
Мартін Волек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.