2009-08-10 2 views
500

По какой-то причине, когда я изначально вытащил из репозитория для моего проекта git, У меня есть тонна файлов в моей рабочей копии, которые не имеют заметных изменений, сделанных для них, но продолжают отображаться в моей области unstaged changes ,Как удалить файлы с «старым режимом 100755 нового режима 100644» из неустановленных изменений в Git?

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

old mode 100755 
new mode 100644 

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

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

ответ

850

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

This msysgit issue's replies предлагает создать core.filemode ложь для того, чтобы избавиться от вопроса:

git config core.filemode false 
+95

+1. Это означает, что git считает, что он может корректно установить исполняемый бит в извлеченных файлах, но когда он пытается это сделать, он не работает (или, по крайней мере, не так, как он может читать). Когда он затем считывает состояние этих файлов, похоже, что исполняемый бит был намеренно отключен. Установка core.filemode в false указывает git игнорировать любые изменения исполняемого бита в файловой системе, поэтому он не будет рассматривать это как изменение. Если вам нужно выполнить исполняемое битное изменение, это означает, что вам нужно вручную выполнить git update-index --chmod = (+ | -) x '. –

+3

Если, как и я, изменения режима важны, вы можете установить значение core.filemode в false, зафиксировать фактические изменения кода, а затем установить для core.filemode значение true и git сохранит изменения файла. –

+8

У меня такая же проблема, но это было связано с использованием одного и того же git-воспроизведения через SSH git cmd line и через Git Extensions на сопоставленном диске в Windows! , , Решение было таким же, добавлено в «config» [core] filemode = false –

6

Вы можете попробовать мерзавца сбросить --hard ГОЛОВУ сбросить репо в ожидаемом состоянии по умолчанию.

+4

Если git не смог установить исполняемый бит правильно/последовательно после вытягивания, после сброса не будет лучше. –

+0

Этот способ отлично подходит для копируемого репозитория, где копия перевернула флаг. – AndrewCr

+1

+1 работал, моя ошибка была chmod 777 в .git папку – jimy

73

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

+2

Был там, сделал это. К сожалению, я нашел ваш комментарий только после того, как сам решил проблему. Тем не менее, +1! –

+1

Если другие пользователи клонируют этот проект в Windows, возможно, лучше всего применить это изменение к файлу '~/.gitconfig'! –

4

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

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

$ git checkout . 
0

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

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

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

0

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

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

Вам может понадобиться сделать:

chmod -x <file> // Removes execute bit 

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

3

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

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

Первая команда будет на самом деле урегулирования разногласий, которые сообщили мерзавец различий, но аннулирует вашу способность перечислить каталоги, поэтому 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 
+1

Спасибо, мне очень помогли! Также следует проверить, что 'git config core.filemode' установлен как' true', в противном случае изменения разрешения не будут обнаружены. Мне также нужно было обновить индекс git после каждого изменения, чтобы поднять его. –

+0

Это решение является самым безопасным, если вы беспокоитесь о зависимых зависимостях. –

Смежные вопросы