Git хочет добавить уже отслеженные файлы
У меня есть репозиторий на ПК размером примерно 70 ГБ, и когда я скопировал его (не клон, просто копирую) на мой Mac, он показывает, что некоторые файлы не отслеживаются, хотя они уже отслеживаются.
Когда я их добавил, они, казалось, дублировались в информации об объектах репо, но не в рабочем дереве, конечно. Поэтому я сделал полный сброс до последнего коммита, но файлы снова появились как неотслеживаемые.
Как я могу решить эту проблему? (зная, что репо на ПК работает хорошо)
2 ответа
Не копируйте рабочий каталог репозитория с компьютера на компьютер.
проблема
Ваш рабочий каталог извлек файлы в соответствующих концах строк. Ваша машина Windows использует возврат каретки и перевод строки для обозначения новой строки, а ваш Mac - нет. Вы должны были настроить свой компьютер для преобразования строки в вашем хранилище. Копирование файлов из Windows на Mac представляет файлы с окончаниями строк в стиле Windows на вашем Mac, где они не принадлежат.
Git решил, что ваши файлы имеют неизмененные изменения[1], потому что ваша конфигурация окончания строки инструктирует ваших клиентов сохранять окончания строки в стиле Unix в репозитории и преобразовывать в правильный формат окончания строки при извлечении файлов. Это означает, что когда вы проверяли файлы на своем ПК, они были преобразованы в окончания строк в стиле Windows. Но ваш Mac рассчитывает не изменять окончание строк для хранилища.
Таким образом, ваш репозиторий содержит файлы в формате Unix, а ваш Mac - в формате Windows. Поэтому, когда вы бежите git status
Git понимает, что файлы в рабочем каталоге отличаются от файлов в хранилище. (отличается только окончаниями строк) и сообщает, что в файлах есть изменения без изменений.
Другие проблемы
Есть и другие причины не копировать репозиторий с одного компьютера на другой. Git определяет поведение компьютера при создании или клонировании репозитория (через git init
или же git clone
). Данные о системе, например, является ли файловая система чувствительной к регистру или нечувствительной к регистру, и поддерживает ли файловая система символические ссылки, хранятся в конфигурации репозитория.
Если вы скопируете репозиторий с рабочим каталогом с компьютера Windows на Mac, ваш репозиторий больше не будет поддерживать символические ссылки. Начиная с Mac и заканчивая машиной с Linux, ваш репозиторий будет очень запутанным, поскольку считает, что регистр не учитывается.
Наконец, даже если вы копируете репозиторий на компьютер того же типа - или даже на тот же компьютер - вы можете столкнуться с проблемами. Git кэширует некоторую информацию о рабочем каталоге в индексе. Копирование рабочего каталога должно сделать этот кеш недействительным, но некоторые клиенты Git могут (неправильно) подчиняться кешу после копирования, что может дать ложную информацию.
Решение
Это один из немногих случаев, когда вы действительно хотите удалить свой репозиторий и начать заново. Вы можете удалить все файлы в вашем рабочем каталоге и очистить вашу конфигурацию. Но на данный момент реально намного проще просто git clone
этот репозиторий на ваш Mac.
Поскольку хранилище велико, если вы не хотите расходовать сетевой трафик, вы можете просто клонировать из существующего хранилища, которое вы скопировали. (Он будет игнорировать как неправильно настроенные файлы рабочего каталога, так и неверную конфигурацию.) Например, если ваш поврежденный репозиторий находится в badrepo
:
git clone badrepo goodrepo
[1]: Терминология: в ваших файлах нет изменений, ваши файлы не отслеживаются. Не отслеживаемые файлы - это те, которых еще нет в хранилище.