Как удалить файлы с "старым режимом 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 игнорировать изменение файлового режима, вот несколько способов:
-
Конфигурация ТОЛЬКО для текущего репо:
git config core.filemode false
-
Конфиг глобально:
git config --global core.filemode false
-
Добавьте в ~/.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
затем зафиксировать ветку.