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


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

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


1890
2017-10-16 21:43


походження


Це корисно при роботі з git у Windows + Bash у Ubuntu у Windows - Elazar
Для тих, хто просто хоче ігнорувати зміни до дозволу для конкретного виклику git diff, і тому не хоче змінювати свої конфігураційні файли Git: ви можете використовувати git diff -G. за Зеда відповісти тут. - sampablokuper


Відповіді:


Спробуйте:

git config core.fileMode false

Від git-config (1):

core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

The -c Прапор може бути використаний для встановлення цього параметра для одноразових команд:

git -c core.fileMode=false diff

І це --global прапор зробить це за замовчуванням для зареєстрованого користувача.

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


3117
2017-10-16 21:53



Якщо ти зробиш git config --global core.filemode false вам потрібно буде зробити це лише один раз для всіх репо. - Greg
це не спрацювало для мене, поки я не виправив справу, вона повинна бути fileMode замість filemode - tishma
@ sithma: розділ конфігурації Git і імена змінних нечутливий до регістру відповідно до документації, див. розділ "ФАЙЛ КОНФІГУРАЦІЇ", так що, якщо вищесказане не працює для вас, то це було з іншої причини. - Greg Hewgill
@ donquixote: The git config команда записує налаштування на правильний файл конфігурації (.git/config тільки для поточного сховища, або ~/.gitconfig якщо використовується з --global) - Greg Hewgill
@ zx1986: Не має значення. Від git config: "Імена змінних нечутливі до регістру, ..." - Greg Hewgill


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

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

Або в мінва-гіт

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

247
2018-01-18 02:20



На ОС X Lion опустіть -d'\n' частина від xargs оскільки це нелегальний аргумент (і не потрібний). - Pascal
Ви можете ігнорувати будь-які помилки щодо "chmod: відсутній операнд після" + x " - Casey Watson
це актуально? Я отримую "chmod: занадто мало аргументів" в mingw - hammett
@Pascal @pimlottc -d Визначає роздільник як нову лінію замість будь-якого пробілу. BSD xargs не має такої можливості, але замість цього ви можете прокачати вихід через tr '\n' '\0' а потім використовуйте -0 Аргу в xargs використовувати NUL як роздільник. - Mark Aufflick
Прохолодний tr справа працювала! Ось повна команда для OSX: git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x - K.-Michael Aye


Якщо ви хочете встановити цей параметр для всіх ваших репо, скористайтеся --global варіант

git config --global core.filemode false

Якщо це не працює, ви, ймовірно, використовуєте нову версію git, тому спробуйте --add варіант

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

Якщо ви запускаєте його без глобального варіанту, і ваш робочий каталог не є репо, ви отримаєте

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

115
2018-04-21 12:00



Не працює для мене на Git версії 1.7.9.6 (Apple Git-31.1) - Filip Kunc
Схоже, використовується пізніший GIT --add, а саме git config --add --global core.filemode false - mgaert
Якщо локальна конфігурація repo вже має файловий режим = true, зміна глобальної конфігурації не допоможе, оскільки локальна конфігурація перевизначить глобальну конфігурацію. Потрібно буде змінити локальну конфігурацію кожного репо машини один раз - Syed Rakib Al Hasan
ПОПЕРЕДЖЕННЯ. Оновіть цю відповідь із попередженням syedrakib! Все стало божевільним, перш ніж я його знайшов, і зробив відчутний сенс після. - jerclarke


Якщо

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 init

ти закінчиш!


66
2017-08-06 13:10



Замість редагування .git/config, просто git config core.fileMode false в корені вашого проекту вистачає. Якщо ви редагуєте файл конфігурації, вам краще повністю вилучити директиву, щоб отримати глобальний файл. - Felix
-1, якщо git config --global не працює, це означає, що у вас немає дозволів для цього на рівні системи, видалення global варіант робить точно так само, як вручну редагування .git / config - CharlesB
@CharlesB невірно - відповідь надав обхідний шлях, поставивши цей параметр безпосередньо в проект, роблячи його специфічним для проекту. Це не буде працювати з іншими проектами git, які ви робите / перевіряєте в майбутньому, але працює для проекту, над яким ви працюєте. (давайте переконаємося, що ми збігаємось ~/.gitconfig, і ~/project/.git/config) - sircapsalot
Як тільки це закінчиться git init чи слід ми встановити файловий режим до істинного? - Jordan


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

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


48
2017-10-16 22:03



Це повинно було бути відредаговане на відповідь Грега Хівгілла, а не додано як окрема відповідь, таким чином, створена одна найвища відповідь з єдиним однозначним представленням. - Greg
@Greg: потрібно мати достатньо очок, щоб редагувати не власну відповідь; Я думаю, що мені не вистачило часу для редагування дозволів. - Jakub Narębski
@ Якуб Я думаю, що у вас зараз достатньо репутації :) Яка ця команда виглядатиме як приклад файл? - Alex Hall


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

git config --global core.filemode false

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

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

git config --unset core.filemode

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

git config core.filemode false


32
2018-01-21 09:12



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


Якщо ви використали chmod команда вже потім перевіряє різницю файлу, він показує попередній режим файлу і поточний режим файлу, такі як:

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

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

встановити старий режим всіх файлів, використовуючи команду нижче

sudo chmod 644 .

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

git config core.fileMode false

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

sudo chmod 755 .

і знову встановіть core.fileMode на істину.

git config core.fileMode true

Для кращих практик не зберігайте постійний файл keep core.fileMode.


16
2017-10-13 07:34



Ви кажете, що весь проект (у процесі розробки, постановки та виробництва) повинен бути 755? - Daniel
@ Даніель Лют: Ні, змінюйте режим лише необхідних файлів. - Kishor Vitekar
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 є абсолютно необхідним у локальній конфігурації, якщо ви не бажаєте роздувати історію виконання з непотрібними та ненавмисними змінами дозволу - KevinOrr
Також, чому ти турбуєшся, коли взагалі змінюється залежність? Якщо ви встановили core.filemode=false тоді git буде ігнорувати виконувати бітові зміни, не потрібно змінювати локальні дозволи. Якщо ви ще не додали змін до індексу дозволу, у цьому випадку вам не вистачає кроку, де вам знадобиться git add після вимкнення core.filemode. - KevinOrr


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


14
2017-07-16 12:23



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


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

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

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

git nfm status

14
2017-07-24 15:01





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

Вдарю це Просто віддаю перевагу в папці проекту (це не призведе до видалення оригінальних змін) ... це буде тільки видалити зміни що було зроблено поки ви змінилися Дозволити папку проекту

рекомендую нижче:

git config core.fileMode false

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

коли ти будеш перевіряти зміни, що ти не зробив? Ви знайшли такий спосіб, як під час використання git diff filename

enter image description here


1
2018-03-19 13:13





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

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

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

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

0
2018-04-30 15:06