Як видалити файли, які говорять "старий режим 100755 новий режим 100644" з нестандартних змін у Git?


723

З якоїсь причини, коли я спочатку витягував із сховища проект мого git, я отримав у своїй робочій копії тони файлів, які не мали в них помітних змін, але продовжують показуватися в моєму unstaged changesрайоні.

Я використовую Git Gui в Windows xp, і коли я переходжу до файлу, щоб побачити, що змінилося. Все, що я бачу, це:

old mode 100755  
new mode 100644  

Хтось знає, що це означає?

Як я можу вивести ці файли зі свого списку нестандартних змін? (Дуже прикро переглядати 100 файлів, просто вибирати файли, які я нещодавно відредагував і хочу зробити.

Відповіді:


1284

Це виглядає як режими дозволу файлів Unix для мене ( 755= rwxr-xr-x, 644= rw-r--r--) - старий режим включав прапор + x (виконується), новий режим - ні.

У відповідях цього випуску msysgit пропонується встановити параметр core.filemode на значення false, щоб позбутися проблеми:

git config core.filemode false

132
+1. Це означає, що git вважає, що він може правильно встановити виконуваний біт на перевірені файли, але коли він намагається це зробити, він не працює (або, принаймні, не таким чином, що він може читати). Коли він потім зчитує стан цих файлів, схоже, що виконуваний біт був свідомо знятий. Якщо встановити core.filemode на false, git повідомляє git ігнорувати будь-які виконувані зміни бітів у файловій системі, щоб він не сприймав це як зміну. Якщо вам потрібно здійснити зміну виконуваного біта, це означає, що це потрібно зробити вручну git update-index --chmod=(+|-)x <path>.
КБ Бейлі

7
Якщо, як і я, важливі зміни режиму, ви можете встановити core.filemode на false, здійснити фактичні зміни коду, а потім встановити core.filemode на true та git збереже зміни файлу.
Майкл Т. Сміт

8
У мене така ж проблема, але це було пов’язано з використанням того ж git repro через SSH git cmd-лінійку та через Git Extensions на зібраному диску в Windows! . . Рішення було те саме, додане в "config" [core] filemode = false
Ian Vaughan

2
Це було рятівником життя, дякую сер! Це сталося зі мною на OSX, після того як я поділився клонованим сховищем у загальнодоступній папці та змінив дозволи для файлів.
Тіаго Гансароллі

8
@robsch Ви можете git config --global ...встановити параметр у вашому глобальному конфігураційному файлі.
Бурштин

98

Встановлення core.filemodeзначення false не працює, але переконайтесь, що налаштування в ньому ~/.gitconfigне перекриваються налаштуваннями .git/config.


3
Був там зробив те. На жаль, я знайшов ваш коментар лише після того, як я сам вирішив проблему. Все-таки +1!
Девід Шмітт

1
Якщо інші користувачі клонують цей проект у Windows, можливо, найкраще насправді просто застосувати зміну до ~/.gitconfigфайлу!
Ян Вон

Якщо ви хочете перевірити Windows Powershell. git config --list --show-origin | sls filemodeабо на Linux git config --list --show-origin | grep filemode. Це покаже вам, де потрібно внести корективи.
Франк Фу

Ти впорався!! Молодці.
Кім

27

З цією проблемою я стикався, коли копіював git repo з робочих файлів зі старого жорсткого диска кілька разів. Проблема випливає з того, що власник та дозволи змінилися зі старого диска / машини на новий. Довгий і короткий його варіант, виконайте такі команди, щоб виправити речі ( завдяки цій відповіді суперпользователя ):

sudo chmod -R -x . # remove the executable bit from all files

Колишня команда фактично вирішить відмінності, про які повідомляється git diff, але позбавить вашої можливості перелічувати каталоги, тому ls ./не вдається ls: .: Permission denied. Щоб виправити це:

sudo chmod -R +X . # add the executable bit only for directories

Погана новина полягає в тому, що якщо у вас є файли, які ви хочете зберегти у виконанні, наприклад, .shсценарії, вам потрібно буде відновити їх. Це можна зробити за допомогою наступної команди для кожного файлу:

chmod +x ./build.sh # where build.sh is the file you want to make executable again

2
Дякую, мені дуже допомогли! Також слід перевірити, що git config core.filemodeвстановлено true, інакше зміни дозволу не будуть виявлені. Також мені потрібно було оновити індекс git після кожної зміни, щоб забрати його.
пт-с

Це рішення є найбезпечнішим, якщо ви турбуєтесь про постраждалі залежності.
Джин

9

Зазвичай відбувається, коли репо клонується між машинами Windows та Linux / Unix.

Просто скажіть git ігнорувати зміни файлового модуля, ось декілька способів:

  1. Налаштуйте ТІЛЬКО для поточного репо:

    git config core.filemode false
    
  2. Налаштування глобально:

    git config --global core.filemode false
    
  3. Додати в ~ / .gitconfig:

    [core]
         filemode = false
    

Просто виберіть один із них.


Глобальний конфігурація не працює, тому що (я думаю) git створює репо з цим параметрами, встановленими на true (я створив репо в Linux)
Herrgott

4

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

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .

3

Ви можете спробувати скинути git --hard HEAD, щоб повернути репо до очікуваного стану за замовчуванням.


8
Якщо git не зміг встановити виконуваний біт правильно / послідовно після витягування, після скидання це не буде краще.
CB Bailey

2
Я перемістив кілька проектів на USB-накопичувач (fat32) і знову повернувся до своєї машини ubuntu (ext4) і закінчив купу змінених файлів, ну атрибутів. git reset --hard HEADпрекрасно працював для мене. дякую
cirovladimir

7
-1. ОП заявляє, "просто щоб вибрати файли, які я нещодавно відредагував, і хочу зробити це". Це також видалить ці зміни.
вітфін

9
-1 Пропонувати цю команду в git схоже на те, що сказати "ви можете просто rm -rf ./, я впевнений, що це не матиме ніяких ненавмисних наслідків".
Kzqai

1
Ні, це не допомагає, і це проблема. Ви скидаєте та очищаєте, а статус git відображає зміни режиму. Це серйозна проблема з Windows git, і я думаю, що це слід виправити, а не просто обійти шляхом ігнорування файлового режиму.
везенков


1

Це трапляється, коли ви витягуєте, і всі файли виконувались у віддаленому сховищі. Якщо знову зробити їх виконаними, то знову все нормалізується.

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

Можливо, вам доведеться зробити:

chmod -x <file> // Removes execute bit

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


1

Ви можете скористатися наступною командою, щоб змінити режим файлу назад. git add --chmod=+x -- filename Потім зобов’язатись у відділення.


0

У мене був лише один проблемний файл із зміненими дозволами. Щоб повернути його окремо, я просто видалив його вручнуrm <file> а потім зробив замовлення, щоб дістати свіжу копію.

На щастя, я її ще не поставив.

Якби я мав би, я міг би бігти git reset -- <file>до бігуgit checkout -- <file>


0

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

Спочатку я запустив різницю:

git checkout my-branch
git diff master

Це повернуло:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

Потім я запустив таке, щоб виправити:

rm bin/script.sh
git merge -X theirs master

Після цього git diffне повернулися відмінності між моїм відділенням та майстром.

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