Файли, що відображаються як модифіковані безпосередньо після клонування Git


227

Наразі у мене проблема з сховищем, і хоча мій 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трюк, який не дуже вдався.

Відповіді:


141

У мене була така ж проблема і на Mac після клонування сховища. Передбачається, що всі файли були змінені.

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

* text=auto

Я прокоментував це, і всі інші клоновані сховища відтепер працюють нормально.


5
Дякую! Нарешті я виявив це, провівши весь вечір перемикаючи core.autocrlf і apply.whitespace. Це спрацювало. Дякую.
xer0x

5
Лінія образи в .gitattributes походила з точок файлів Матіаса Байнена , на випадок, якщо хтось інший стикається з цим.
SeanPONeil

31
Чи може хтось пролити більше світла на цю конкретну конфігурацію? Що робить * text=auto? Що означає його видалити .gitattributes? Я бачу, що вона вирішує цю проблему для мене, але я не впевнений, чому це робиться, і що вона насправді робить, і які можливі проблеми, можливо, це створює?
Денніс

6
@Dennis Цей параметр допомагає нормалізувати закінчення рядків, тому його видалення, ймовірно, не є правильним. Дивіться відповідь на це питання та цю статтю . Відповідь @Arrowmaster нижче була більш корисною для мене. Я використав git addі git commitякий нормалізував файл і позбувся проблеми.
jtpereyda

4
git config --global core.autocrlf inputвиправили це для мене. Дякую.
dimiguel

89

Зрозумів. Усі інші розробники працюють на Ubuntu (я думаю) і тому мають файлові системи, що залежать від регістру. Я, однак, цього не роблю (так як я на Mac). Дійсно, у всіх файлах були маленькі близнюки, коли я переглянув їх за допомогою git ls-tree HEAD <path>.

Я змушу одну з них розібратися.


Вони коли-небудь розбиралися? У мене, можливо, є те саме питання.
Джош Джонсон

8
Так, просто дозвольте комусь із файловою системою, що враховує регістри, щоб видалити всі, крім одного, з кожного набору файлів, які мали б повторювані назви файлів у файловій системі, нечутливій до регістру.
Сем Елліотт

1
Щойно зіткнувся з тією ж проблемою з моменту переходу з Ubuntu на Mac. Спасибі, ваша відповідь вдарила цвяхом по голові. Сподіваюся, що оновлення підштовхує його до першої позиції. :-)
chmac

1
@Dirk. Тому є кілька відповідей. Я прийняв той, який застосований у моєму випадку, який не є необґрунтованим.
Сем Елліотт

1
Це було і моїм питанням - нечутливий до справи MacOS. Однак git ls-tree HEAD <path>показав лише один файл. Однак мені вдалося побачити повторювані файли в інтерфейсі GitHub.com, а також використати цей інтерфейс для видалення однієї версії.
orion elenzil

74
git config core.fileMode false

вирішив цю проблему в моєму випадку

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

TL; DR;

core.fileMode

Якщо значення false, ідентифікаційні бітові відмінності між індексом та робочим деревом ігноруються; корисно для зламаних файлових систем, таких як FAT. Див. Git-update-index (1).

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


2
Але що це робить ??
Сівель

1
Я також хотів би знати, що це робить, бо це працювало і на мене.
Донато

2
Коли я це зробив git diff, я виявив, що зміни були лише у файловому режимі. мерзотник підхоплює , chmod -R 777 .який був викликаний , коли я запустив свій проект , і це дозволило мені конфиг ігнорувати CHMOD зміни від мерзотника stackoverflow.com/q/1580596/6207775
Ayushya

1
Посилання розірвано ( "Вибачте, ми не можемо знайти ваші ядра" ).
Пітер Мортенсен

Решта відповідей не спрацювала, це, однак, зробило магію!
Зустрітися з Пател

53

Я припускаю, що ви використовуєте Windows. Ця сторінка GitHub, на яку ви пов’язали, має деталі назад. Проблема полягає в тому, що закінчення рядків CR + LF були записані в сховище і тому, що у вас є core.autocrlf, встановлений на істинний, або на вхідний , Git хоче перетворити закінчення рядків у LF, тому git statusпоказує, що кожен файл змінюється.

Якщо це сховище, до якого ви хочете отримати доступ, але не маєте участі в ньому, ви можете запустити наступну команду, щоб просто приховати проблему, фактично не вирішивши її.

git config core.autocrlf false

Якщо це сховище, до якого ви будете брати активну участь і можете здійснювати зміни. Ви можете вирішити проблему, зробивши зобов’язання, яке змінює всі закінчення рядків у сховищі, щоб використовувати LF замість CR + LF, а потім вжити заходів, щоб у майбутньому це не повторилося.

Далі взято безпосередньо зі сторінки gitattributes man і має бути попередньо оформлено з чистого робочого каталогу.

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

8
Я не використовую Windows.
Сем Елліотт

1
За замовчуванням у системах, які не є Windows, для core.autocrlf встановлено значення false. Тож ви навіть не мали б відчувати цю проблему, якщо вона викликана закінченнями рядків. Чи можете ви надати більше детальних відомостей про вашу конкретну настройку, наприклад, що git diffпоказує для тих файлів, які git statusговорять про модифіковані, а також яку файлову систему ви використовуєте?
Arrowmaster

оновив запитання відповідями на ці запитання. Ще раз перегляньте всі деталі через секунду-дві. Я не впевнений, що використовують інші члени команди розробників
Сем Елліотт

Це те, що працювало для нас ( git config core.autocrlf falseбуло достатньо). Нас обдурило те, що клієнт працює на Linux (SL / RHEL), але сеанс Linux ініціюється через x2go від хоста Windows. Тож це може бути найімовірнішим рішенням у однорідному контексті Win + Lin.
Дірк

37

Будь ласка, запустіть наступні команди. Це може вирішити проблему.

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

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

Жодне з інших рішень не працювало на мене, але це повернуло мене до роботи.
rainabba

1
Я спробував цей, і він працював на мене. Дякую, пане ЛІама!
Даніель Малий

Це робить моє сховище гіршим. На гілці, яка не мала змін, я мав 277 після її запуску. Ті ж зміни були і в інших галузях, до яких я перейшов. Бігайте обережно. Щойно я повернувся до репо і маю 615 файлів змінених. :(
Програміст Пол

для мене це працювало за допомогою git v2.7.4 з ubuntu (WSL), Git для Windows v2.18.0.windows.1 та posh-git. У мене завжди було помилково autocrlf, і проблема почалася в Git для Windows та posh-git після оновлення до 2.18.0 сьогодні
Джим Фрінетт

Я вражений цим твором. Дякую за допомогу. Для інших, хто йде по цьому шляху, усі файли, які, здавалося б, були модифіковані, - усі .png та .bmp файли, якими керував git LFS
David Casper

16

У Visual Studio, якщо ви використовуєте Git, ви можете автоматично генерувати файли .gitignore та .gitattributes. Автогенерований файл .getattributes має такий рядок:

* text=auto

Цей рядок знаходиться у верхній частині файлу. Нам просто потрібно було прокоментувати рядок, додавши # на передню частину. Після цього справи діяли так, як очікувалося.


1
Дякую, боровся з цим у відпустках
Ендрю Беррі

Це було саме моє питання. Інший розробник використовував GIT через VS замість CLI і створив цей .gitattributes файл.
Джош Мааг

12

Проблема також може виникнути через різні дозволи файлів , як це було у мене:

Свіжий клонований сховище (Windows, Cygwin):

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

Голий віддалений сховище (Linux):

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

5

Я хотів додати відповідь, спрямовану на тему "Чому" це відбувається, тому що вже є хороша відповідь про те, як це виправити.

Отже, .gitattributesє * text=autoналаштування, яке викликає це питання.

У моєму випадку файли в головній гілці GitHub мали \r\nзакінчення. Я набрав налаштування в сховищі для реєстрації із \nзакінченнями. Я не знаю, що Git перевіряє. Передбачається перевірка \nфайлів із \r\nвласними закінченнями на моєму вікні Linux ( ), але я думаю, що він перевірив файл із закінченнями. Git скаржиться, бо бачить перевірені \r\nзакінчення, які були у сховищі, і попереджає мене, що він перевіриться в \nналаштуваннях. Отже файли "підлягають модифікації".

Це зараз моє розуміння.


3

У мене була така ж проблема. Також з Mac. Переглядаючи сховище на машині Linux, я помітив, що у мене є два файли:

geoip.dat і GeoIP.dat

Я видалив застарілий на машині Linux і знову клонував сховище до Mac. Мені не вдалося витягнути, скопіювати, приховати або витягнути зі своєї копії сховища, коли були дублікати.


3

Те саме питання для мене. У віддаленому сховищі Git я міг бачити кілька зображень з такою ж назвою, як "textField.png" та "textfield.png", але не в моєму локальному сховищі. Мені вдалося побачити лише "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's database.
git reset --hard

Нарешті, ми вирішили, що кожен розробник повинен змінити свою конфігурацію Git, щоб це не повторилося:

# Local Git configuration
git config core.ignorecase = true

або

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

Було б краще, якщо ви просто upvoted@ kds відповідь !
Ельхароні

Здається, що в командному рядку команда не повинна мати знак рівності ( =), оскільки вона виявиться ignorecase = =у файлі config.
Дмитро

1

У мене теж була така ж проблема. У моєму випадку я клонував сховище, і деякі файли одразу були відсутні.

Це було викликано тим, що шлях до файлу та ім'я файлу були занадто довгими для Windows. Щоб вирішити це, клонуйте сховище якомога ближче до кореня жорсткого диска, щоб зменшити довжину шляху до файлу. Наприклад, клонуйте його C:\A\GitRepoзамість C:\Users Documents\yyy\Desktop\GitRepo.


1

Редагуйте названий файл .git/config:

sudo gedit .git/config

Або:

sudo vim .git/config

Зміст

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

[remote "origin"]
    url = kharadepramod@bitbucket.org: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.


Це еквівалентноgit config core.Filemode false
Гільєрмо

1

Для нових версій macOS це може бути зумовлено функцією захисту ОС.

У сховищі, над яким я працював, був двійковий файл, який мав * .app як тип файлу.

Це були лише деякі серіалізовані дані, але macOS розглядає всі * .app файли як програму, і оскільки цей файл не завантажувався користувачем, система вважала це небезпечним і додала com.apple.quarantineатрибут файлу, який гарантує, що файл не може бути виконаний.

Але встановлення цього атрибуту на файл також змінило файл, і тому він з’явився у наборі змін Git без жодного способу його повернення.

Ви можете перевірити, чи є у вас така ж проблема, запустівши $ xattr file.app.

Рішення досить просте, якщо вам не доведеться працювати з файлом. Просто додайте *.app binaryдо свого .gitattributes.


0

Я скопіював своє місцеве сховище в іншу папку, і з’явилася купа модифікованих файлів. Моє вирішення було таким: я приховав модифіковані файли та видалив копію . Сховище стало чистим.


0

Я виявив, що Git обробляє мої файли (у цьому випадку .psd) як текст. Встановивши його на бінарний тип у .gitattributes вирішив його.

*.psd binary

0

Я намагався зробити інтерактивну базу даних, але він стверджував, що є деякі модифіковані файли, тому мені це не дозволило зробити це прямо зараз. Я спробував усе, щоб повернутися до чистого сховища, але нічого не вийшло. Жодна з інших відповідей не допомогла. Але це нарешті спрацювало ...

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

Бум! Чистий сховище. Проблема вирішена. Тоді я просто повинен був скинути останнє зобов’язання, коли я зробив своє, rebase -iі нарешті все знову було чисто. Химерно!


0

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

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


1
Було б корисно (і цікаво) дізнатись, які версії git не грають добре разом.
jpaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.