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

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

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

old mode 100755  
new mode 100644  

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

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

Ответ 1

Это выглядит как режимы разрешений для файлов unix для меня (755= rwxr-xr-x, 644= rw-r--r--) - старый режим включал флаг + x (исполняемый файл), новый режим не работает.

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

git config core.filemode false

Ответ 2

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

Ответ 3

Я столкнулся с этой проблемой при копировании репозитория 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

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

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

$  git checkout .

Ответ 5

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

Ответ 6

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

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

Вам может потребоваться сделать:

chmod -x <file> // Removes execute bit

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

Ответ 7

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

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

Ответ 8

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

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

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

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

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

    [core]
         filemode = false
    

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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