Git обнаруживает измененные файлы, которые фактически идентичны байту
У меня есть проблема с git (через git черепахи), которая показывает некоторые файлы моего проекта как измененные, но на самом деле они не изменены. Я дважды проверил это, сделав свежий клон репозитория, и, не касаясь его, у меня уже есть git обнаружить "измененные" файлы во вновь созданной рабочей копии. Это раздражает, потому что некоторые операции заблокированы (потому что это переопределило бы мои "измененные" файлы), но я не могу отменить их, удаление + возврат также не работает. Фиксация "изменений" работает, но это не идеальное решение.
Я на Windows, использую TortoiseGit 1.8.16.0 и Git 2.6.4. С помощью git status
напрямую также показывает, что те же файлы "изменены".
Кажется, это происходит только в каталоге моего проекта, который раньше был подмодулем, но сейчас я использую поддерево git. Поэтому в какой-то момент я полностью удалил подмодуль (или мне так кажется) и создал поддерево.
У кого-нибудь была такая же проблема? Как я могу это исправить раз и навсегда? (даже после фиксации "изменений", через некоторое время, иногда недели спустя, у меня будут другие файлы, а иногда и те же файлы, начинающие показывать ту же странную проблему).
Вот результат diff для одного из этих файлов: git diff app.config
diff --git a/Ozytis.Common/Web/app.config b/Ozytis.Common/Web/app.config
index 3686aab..f559fe7 100644
--- a/Ozytis.Common/Web/app.config
+++ b/Ozytis.Common/Web/app.config
@@ -1,25 +1,25 @@
-<U+FEFF><?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <configSections>
- <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
- <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=ne
utral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
- </configSections>
- <runtime>
- <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
- <dependentAssembly>
- <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
- </dependentAssembly>
- </assemblyBinding>
- </runtime>
- <entityFramework>
- <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
- <parameters>
- <parameter value="v11.0" />
- </parameters>
- </defaultConnectionFactory>
- <providers>
- <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
- </providers>
- </entityFramework>
+<U+FEFF><?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <configSections>
+ <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
+ <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=ne
utral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+ </configSections>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+ <entityFramework>
+ <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
+ <parameters>
+ <parameter value="v11.0" />
+ </parameters>
+ </defaultConnectionFactory>
+ <providers>
+ <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
+ </providers>
+ </entityFramework>
</configuration>
\ No newline at end of file
Для этого файла diff показывает, что все строки изменены. Однако я проверил с помощью шестнадцатеричного редактора с предыдущей и текущей версией файла, переводы строк одинаковы, фактически каждый байт одинаков.
Кроме того, некоторые файлы показывают, что только несколько строк отличаются (но, опять же, они не являются). Несмотря на то, что весь файл имеет постоянные переводы строки.
1 ответ
Кажется, действительно, это проблема с окончанием строки (спасибо user3159253 и HBHB за их комментарии по этому поводу).
Выглядит как ошибка git, потому что почему он сообщает о разных файлах, но в то же время, когда вы получаете их на своем компьютере, он меняет окончания строк, так что вы не видите, в чем разница? Я считаю, что это не должно показывать различия в конце строки (не с git status
а не с git diff
) если он настроен на их изменение в любом случае.
Кроме того, я уже пытался изменить core.autocrlf, прежде чем задавать мой вопрос, но оказалось, что мой проект содержит атрибуты.gitattributes, и это была настоящая проблема. Файл начался с * text
и затем несколько форматов файлов изменяются на двоичные, и это имеет приоритет перед core.autocrlf. Поскольку все работают над Windows для этого проекта, я изменил его на * binary
(см. обновление ниже), по крайней мере, теперь все ясно. Это заставило git обнаружить еще несколько файлов как измененных (опять же, git не согласен с этим?), Но на этот раз я действительно вижу различия в конце строки. Я совершил их, и я надеюсь, что это конец истории.
ОБНОВИТЬ:
С помощью * binary
в.gitattributes тоже не работает, потому что теперь git не может объединять текстовые файлы, так как считает, что они двоичные. Правильная версия (если вы хотите, чтобы git не менял окончания строк, но все же правильно объединял текстовые файлы) * -text
:
Отключение атрибута text на пути указывает Git не пытаться выполнять какие-либо преобразования в конце строки при регистрации или извлечении.
http://git-scm.com/docs/gitattributes
Это решение может быть не идеальным, потому что после обновления вашей рабочей копии все ваши файлы будут иметь окончания строк в стиле Unix (потому что это то, что было сохранено в git, я полагаю). Таким образом, вы должны преобразовать все ваши файлы обратно в конец строки Windows (помогает dos2unix) и сделать большой коммит, который будет проблемой для будущего слияния (если таковое имеется).