Как удалить файлы с надписью «старый режим 100755 новый режим 100644» из неустановленных изменений в Git? - PullRequest
637 голосов
/ 11 августа 2009

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

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

old mode 100755  
new mode 100644  

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

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

Ответы [ 11 ]

1120 голосов
/ 11 августа 2009

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

Ответы на этот вопрос msysgit предлагает установить для core.filemode значение false, чтобы избавиться от проблемы:

git config core.filemode false
85 голосов
/ 04 июня 2010

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

17 голосов
/ 02 июля 2017

Я сталкивался с этой проблемой, когда пару раз копировал 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
4 голосов
/ 06 мая 2016

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

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

$  git checkout .
3 голосов
/ 11 августа 2009

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

1 голос
/ 31 мая 2019

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

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

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

    git config core.filemode false
    
  2. Глобальная настройка:

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

    [core]
         filemode = false
    

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

1 голос
/ 24 января 2019

Я столкнулся с той же проблемой. И это спасет мою жизнь https://gist.github.com/jtdp/5443498

git diff -p -R --no-color \ | grep -E "^(diff|(old|new) mode)" --color=never \ | git apply

1 голос
/ 10 апреля 2017

Это происходит, когда вы извлекаете и все файлы были исполняемыми в удаленном хранилище. Если снова сделать их исполняемыми, все снова станет нормальным.

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

Возможно, вам потребуется:

chmod -x <file> // Removes execute bit

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

0 голосов
/ 28 февраля 2019

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

0 голосов
/ 12 октября 2018

Я только что столкнулся с этой проблемой, когда сравнивал свою ветку с мастером. 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.

...