Как удалить файлы с надписью «старый режим 100755, новый режим 100644» из неустановленных изменений в Git?

724

По какой-то причине, когда я изначально извлекал данные из моего репозитория для моего git-проекта, я получил тонну файлов в моей рабочей копии, в которых не было внесено никаких заметных изменений, но они постоянно появляются в моем unstaged changesрегионе.

Я использую Git Gui на Windows XP, и когда я иду, чтобы посмотреть файл, чтобы увидеть, что изменилось. Все, что я вижу, это:

old mode 100755  
new mode 100644  

Кто-нибудь знает что это значит?

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

concept47
источник

Ответы:

1287

Это похоже на режим доступа к файлам в 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 update-index --chmod=(+|-)x <path>.
CB Bailey
7
Если, как и я, изменения режима важны, вы можете установить для core.filemode значение false, зафиксировать фактические изменения кода, а затем установить для core.filemode значение true, и git сохранит изменения файла.
Майкл Т. Смит
8
У меня та же проблема, но это было из-за использования того же git repro через SSH git cmd line и через Git Extensions на подключенном диске в Windows! , , Решение было таким же, добавлено в "config" [core] filemode = false
Ian Vaughan
2
Это было спасение жизни, спасибо, сэр! Это случилось со мной в OSX после того, как я поделился клонированным репозиторием в общей папке и изменил разрешения для файлов.
Тьяго Ганзаролли
8
@robsch Вы можете использовать git config --global ...эту опцию в глобальном конфигурационном файле.
Январь
98

Установка core.filemodeв false работает, но убедитесь, что настройки в ~/.gitconfigне переопределяются в .git/config.

NovelX
источник
3
Был там, сделал это. К сожалению, я нашел ваш комментарий только после того, как решил проблему сам. Тем не менее +1!
Дэвид Шмитт
1
Если другие пользователи клонируют этот проект в Windows, лучше всего применить изменения к ~/.gitconfigфайлу!
Ян Воан
Если вы хотите проверить Windows Powershell. git config --list --show-origin | sls filemodeили в линуксе git config --list --show-origin | grep filemode. Это покажет вам, где вам нужно внести коррективы.
Фрэнк Фу
Ты сделал это!! Отлично сработано.
Ким
27

Я столкнулся с этой проблемой, когда пару раз копировал git-репозиторий с рабочими файлами со старого жесткого диска. Проблема связана с тем, что владелец и права доступа изменились со старого диска / машины на новый. Короче говоря, выполните следующие команды, чтобы исправить ситуацию ( благодаря этому ответу суперпользователя ):

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 после каждого изменения, чтобы поднять его.
Пат-S
Это решение является наиболее безопасным, если вы беспокоитесь о зависимых зависимостях.
Джин
9

Обычно происходит, когда репо клонируется между компьютерами Windows и Linux / Unix.

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

  1. Конфигурация ТОЛЬКО для текущего репо:

    git config core.filemode false
    
  2. Конфиг глобально:

    git config --global core.filemode false
    
  3. Добавьте в ~ / .gitconfig:

    [core]
         filemode = false
    

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

К. Символ
источник
Глобальная конфигурация не работает , потому что (я думаю) мерзавец создает репозиторий с этим набором истина вариантов (я создал репозиторий в Linux)
Herrgott
4

Кажется, вы изменили некоторые разрешения каталога. Я сделал следующие шаги, чтобы восстановить его.

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

$  git checkout .
SuperNova
источник
3

Вы можете попробовать git reset --hard HEAD, чтобы вернуть репо в ожидаемое состояние по умолчанию.

двойник
источник
8
Если git не смог правильно / последовательно установить исполняемый бит после извлечения, он не будет лучше после сброса.
CB Bailey
2
Я переместил некоторые проекты на USB-накопитель (fat32) и снова вернулся на свою машину с Ubuntu (ext4), и в итоге получился набор измененных файлов, ну и атрибуты. git reset --hard HEADработал отлично для меня. спасибо
cirovladimir
7
-1. ОП гласит «просто чтобы выбрать файлы, которые я недавно отредактировал и хочу зафиксировать». Это также удалит эти изменения.
Whitfin
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

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

IskandarG
источник
1

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

WAE
источник
0

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

К счастью, я еще не поставил это.

Если бы я имел, я мог бы бежать git reset -- <file>до запускаgit checkout -- <file>

kEnobus
источник
0

Я только столкнулся с этой проблемой, рассеивая мою ветку с хозяином. Git вернул одну ошибку 'mode', когда я ожидал, что моя ветвь будет идентична master. Я исправил, удалив файл, а затем снова включил мастер.

Сначала я запустил diff:

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не вернулось различий между my-branch и master.

Коллин Кроулл
источник