Файлы, отображаемые как измененные сразу после клона Git

У меня сейчас проблема с хранилищем, и хотя мой Git-fu обычно хорош, я не могу решить эту проблему.

Когда я клонирую этот репозиторий, а затем cd в репозиторий, git status показывает несколько файлов как измененные. Примечание: я не открывал хранилище ни в каком редакторе или в любом другом месте.

Я пытался следовать этому руководству: http://help.github.com/dealing-with-lineendings/, но это не помогло с моей проблемой.

Я попробовал git checkout --. много раз, но, кажется, ничего не делать.

Я на Mac, и в самом репозитории нет подмодулей.

Файловая система - это файловая система Journaled HFS+ на Mac, и она не учитывает регистр. Файлы состоят из одной строки и около 79 КБ каждый (да, вы правильно поняли), поэтому просмотр git diff не особенно полезен. Я слышал о выполнении git config --global core.trustctime false что может помочь, и я попытаюсь вернуться к компьютеру с репозиторием на нем.

Я изменил детали файловой системы с фактами! И я попробовал git config --global core.trustctime false трюк git config --global core.trustctime false который не очень хорошо работал.

Ответ 1

Я понял. Все остальные разработчики работают на Ubuntu (я думаю) и, таким образом, чувствительны к регистру файловых систем. Я, однако, не (как я на Mac). Действительно, у всех файлов были строчные двойники, когда я взглянул на них, используя git ls-tree HEAD <path>.

Я заставлю одного из них разобраться.

Ответ 2

У меня была такая же проблема на Mac после клонирования репозитория. Предполагается, что все файлы были изменены.

После запуска git config --global core.autocrlf input он все еще помечал все файлы как измененные. После поиска исправления я наткнулся на файл .gitattributes в домашнем каталоге, в котором было следующее.

* text=auto

Я прокомментировал это, и любые другие клонированные репозитории отныне работали нормально.

Ответ 3

git config core.fileMode false

решил эту проблему в моем случае

https://git-scm.com/docs/git-config

TL; DR;

core.fileMode

Если false, различия исполняемого бита между индексом и рабочим деревом игнорируются; полезно на сломанных файловых системах, таких как FAT. Смотрите git-update-index (1).

Значение по умолчанию - true, за исключением того, что git-clone (1) или git-init (1) будут проверять и устанавливать core.fileMode false, если это необходимо, при создании хранилища.

Ответ 4

Я предполагаю, что вы используете Windows. Эта страница GitHub, на которую вы ссылаетесь, содержит подробности в обратном направлении. Проблема в том, что окончания строк CR + LF уже зафиксированы в репозитории, а поскольку у core.autocrlf установлено значение true или input, Git хочет преобразовать окончания строк в LF, поэтому git status показывает, что каждый файл изменяется,

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

git config core.autocrlf false

Если это репозиторий, в который вы будете активно вовлечены и сможете вносить изменения. Вы можете решить проблему, сделав коммит, который изменяет все окончания строк в репозитории на использование LF вместо CR + LF, а затем предпринимает шаги, чтобы предотвратить его повторение в будущем.

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

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory.
git status        # Show files that will be normalized.
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

Если какие-либо файлы, которые не должны быть нормализованы, отображаются в git status, удалите их текстовый атрибут перед запуском git add -u.

manual.pdf      -text

И наоборот, для текстовых файлов, которые Git не обнаруживает, можно включить нормализацию вручную.

weirdchars.txt  text

Ответ 5

Запустите следующие команды. Это может решить проблему.

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git database.
git reset --hard

Ответ 6

В Visual Studio, если вы используете Git, вы можете автоматически генерировать файлы .gitignore и .gitattributes. Файл сгенерированный автоматически .getattributes имеет следующую строку:

* text=auto

Эта строка находится в верхней части файла. Нам просто нужно было прокомментировать строку, добавив # к ней. После этого все работало, как ожидалось.

Ответ 7

Проблема может также возникнуть из-за различий разрешений файлов, как и в моем случае:

Свежий клонированный репозиторий (Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Базовый удаленный репозиторий (Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Ответ 8

Я хотел добавить ответ, более направленный на "Почему", это происходит, потому что уже есть хороший ответ о том, как это исправить.

Таким образом, .gitattributes имеет параметр * text=auto, который вызывает эту проблему.

В моем случае файлы в главной ветке GitHubs имели \r\n окончания. Я набрал настройки в хранилище для регистрации с \n окончаниями. Я не знаю, что проверяет Git. Предполагается, что на моем компьютере с Linux (\n) заканчиваются нативные окончания, но я предполагаю, что он извлек файл с окончаниями \r\n. Git жалуется, потому что он видит извлеченные окончания \r\n которые были в хранилище, и предупреждает меня, что он проверит настройки \n. Следовательно, файлы "должны быть изменены".

Это мое понимание на данный момент.

Ответ 9

У меня такая же проблема. Также с Mac. Глядя на репозиторий на машине с Linux, я заметил, что у меня есть два файла:

geoip.dat и GeoIP.dat

Я удалил устаревший на Linux-машине и снова клонировал репозиторий на Mac. Я не смог вытащить, зафиксировать, спрятать или вытащить из своей копии хранилища, когда были дубликаты.

Ответ 10

У меня тоже была такая же проблема. В моем случае я клонировал репозиторий, и некоторые файлы сразу исчезли.

Это было вызвано тем, что путь к файлу и имя файла были слишком длинными для Windows. Чтобы решить эту проблему, клонируйте репозиторий как можно ближе к корню жесткого диска, чтобы уменьшить длину пути к файлу. Например, C:\A\GitRepo его в C:\A\GitRepo вместо C:\Users Documents\yyy\Desktop\GitRepo.

Ответ 11

Отредактируйте файл с именем .git/config:

sudo gedit .git/config

Или же:

sudo vim .git/config

содержание

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = [email protected]:DigitalPlumbing/unicorn-magento.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]
    remote = origin
    merge = refs/heads/master

[branch "productapproval"]
    remote = origin
    merge = refs/heads/productapproval

Измените filemode=true на filemode = false.

Ответ 12

Для новых версий macOS это может быть вызвано функцией безопасности ОС.

В репозитории, над которым я работал, был бинарный файл с типом файла *.app.

Это были только некоторые сериализованные данные, но macOS рассматривает все файлы *.app как приложение, и поскольку этот файл не был загружен пользователем, система сочла его небезопасным и добавила атрибут файла com.apple.quarantine который гарантирует, что файл может не быть выполненным.

Но установка этого атрибута в файле также изменяла файл, и поэтому он отображался в наборе изменений Git без какого-либо способа его возврата.

Вы можете проверить, есть ли у вас такая же проблема, запустив $ xattr file.app.

Решение довольно простое, если вам не нужно работать с файлом. Просто добавьте *.app binary в ваши .gitattributes.

Ответ 13

Та же проблема для меня. Я мог видеть несколько изображений с одинаковыми именами, например "textField.png" и "textfield.png" в удаленном репозитории Git, но не в моем локальном репозитории. Я мог видеть только "textField.png", который не был использован в коде проекта.

Оказывается, большинство моих коллег работают на Ubuntu с файловой системой ext4, а я на Mac с APFS.

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

Затем я запустил следующее:

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git database.
git reset --hard

Наконец, мы решили, что каждый разработчик должен изменить свою конфигурацию Git, чтобы это никогда не повторилось:

# Local Git configuration
git config core.ignorecase = true

или же

# Global Git configuration
git config --global core.ignorecase = true

Ответ 14

Я скопировал свой локальный репозиторий в другую папку, и появилось множество измененных файлов. Мое обходное решение было: Я спрятал измененные файлы и удалил тайник. Репозиторий стал чистым.

Ответ 15

Я обнаружил, что Git рассматривал мои файлы (в нашем случае .psd) как текст. Установка его в двоичный тип в .gitattributes решила это.

*.psd binary

Ответ 16

Я пытался сделать интерактивную перебазировку, но он утверждал, что были некоторые измененные файлы, поэтому он не позволил мне сделать это прямо сейчас. Я перепробовал все, чтобы вернуться в чистый репозиторий, но ничего не получалось. Ни один из других ответов не помог. Но это, наконец, сработало...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

Boom! Чистый репозиторий. Задача решена. Затем мне просто пришлось отбросить последний коммит, когда я сделал rebase -i и, наконец, все снова стало чистым. Bizarre!

Ответ 17

На случай, если это поможет кому-то еще, для этой проблемы может быть другая причина: разные версии Git. Я использовал установленную по умолчанию версию Git на коробке с Ubuntu 18.04 (Bionic Beaver), и все работало нормально, но при попытке клонировать репозиторий с помощью Git в Ubuntu 16.04 некоторые файлы показывались как измененные.

Ни один из других ответов здесь не устранил мою проблему, но обновление версий Git для соответствия в обеих системах решило проблему.