Состояние Git показывает файлы как измененные, даже если содержимое одинаковое
я получил git checkout от кого-то другого и пытаюсь зафиксировать неустановленные изменения в локальном репозитории. Однако,много (если не каждый) файл отображается как изменен даже если содержание точно такое же.
Я уже поставил core.fileMode false, а также установить core.autocrlf false, то без успеха.
стоит отметить, что РЕПО Git, которое я получил, было от кого-то, кто использует Windows, в то время как я использую Линукс.
что я могу сделать, чтобы совершить фактический изменения?
изменить: вывод git config -l:
user.name=Aron Rotteveel
user.email=<removed>
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=auto
color.ui=true
color.pager=true
color.branch.current=yellow reverse
color.branch.local=yellow
color.branch.remote=green
color.diff.meta=yellow bold
color.diff.frag=magenta bold
color.diff.old=red bold
color.diff.new=green bold
color.status.added=yellow
color.status.changed=green
color.status.untracked=cyan
core.pager=less -FRSX
core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol
alias.co=checkout
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
core.autocrlf=false
remote.origin.url=<removed>
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
обновление: добавлены некоторые случайные файлы примеров. Эти файлы являются просто открытым текстом, поэтому их проще всего включить.
исходные файлы находятся здесь:https://gist.github.com/c3c5302430935155ef3d. Hexdumps определенно указывают, что файлы разные, но я понятия не имею, что вызывает это, и как это исправить.
глава версию:
0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740d HTML.SafeObject.
0000010: 0a54 5950 453a 2062 6f6f 6c0d 0a56 4552 .TYPE: bool..VER
0000020: 5349 4f4e 3a20 332e 312e 310d 0a44 4546 SION: 3.1.1..DEF
0000030: 4155 4c54 3a20 6661 6c73 650d 0a2d 2d44 AULT: false..--D
0000040: 4553 4352 4950 5449 4f4e 2d2d 0d0a 3c70 ESCRIPTION--..<p
0000050: 3e0d 0a20 2020 2057 6865 7468 6572 206f >.. Whether o
0000060: 7220 6e6f 7420 746f 2070 6572 6d69 7420 r not to permit
0000070: 6f62 6a65 6374 2074 6167 7320 696e 2064 object tags in d
0000080: 6f63 756d 656e 7473 2c20 7769 7468 2061 ocuments, with a
0000090: 206e 756d 6265 7220 6f66 2065 7874 7261 number of extra
00000a0: 0d0a 2020 2020 7365 6375 7269 7479 2066 .. security f
00000b0: 6561 7475 7265 7320 6164 6465 6420 746f eatures added to
00000c0: 2070 7265 7665 6e74 2073 6372 6970 7420 prevent script
00000d0: 6578 6563 7574 696f 6e2e 2054 6869 7320 execution. This
00000e0: 6973 2073 696d 696c 6172 2074 6f0d 0a20 is similar to..
00000f0: 2020 2077 6861 7420 7765 6273 6974 6573 what websites
0000100: 206c 696b 6520 4d79 5370 6163 6520 646f like MySpace do
0000110: 2074 6f20 6f62 6a65 6374 2074 6167 732e to object tags.
0000120: 2020 596f 7520 7368 6f75 6c64 2061 6c73 You should als
0000130: 6f20 656e 6162 6c65 0d0a 2020 2020 254f o enable.. %O
0000140: 7574 7075 742e 466c 6173 6843 6f6d 7061 utput.FlashCompa
0000150: 7420 696e 206f 7264 6572 2074 6f20 6765 t in order to ge
0000160: 6e65 7261 7465 2049 6e74 6572 6e65 7420 nerate Internet
0000170: 4578 706c 6f72 6572 0d0a 2020 2020 636f Explorer.. co
0000180: 6d70 6174 6962 696c 6974 7920 636f 6465 mpatibility code
0000190: 2066 6f72 2079 6f75 7220 6f62 6a65 6374 for your object
00001a0: 2074 6167 732e 0d0a 3c2f 703e 0d0a 2d2d tags...</p>..--
00001b0: 2320 7669 6d3a 2065 7420 7377 3d34 2073 # vim: et sw=4 s
00001c0: 7473 3d34 0d0a ts=4..
копировать версии:
0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740a HTML.SafeObject.
0000010: 5459 5045 3a20 626f 6f6c 0a56 4552 5349 TYPE: bool.VERSI
0000020: 4f4e 3a20 332e 312e 310a 4445 4641 554c ON: 3.1.1.DEFAUL
0000030: 543a 2066 616c 7365 0a2d 2d44 4553 4352 T: false.--DESCR
0000040: 4950 5449 4f4e 2d2d 0a3c 703e 0a20 2020 IPTION--.<p>.
0000050: 2057 6865 7468 6572 206f 7220 6e6f 7420 Whether or not
0000060: 746f 2070 6572 6d69 7420 6f62 6a65 6374 to permit object
0000070: 2074 6167 7320 696e 2064 6f63 756d 656e tags in documen
0000080: 7473 2c20 7769 7468 2061 206e 756d 6265 ts, with a numbe
0000090: 7220 6f66 2065 7874 7261 0a20 2020 2073 r of extra. s
00000a0: 6563 7572 6974 7920 6665 6174 7572 6573 ecurity features
00000b0: 2061 6464 6564 2074 6f20 7072 6576 656e added to preven
00000c0: 7420 7363 7269 7074 2065 7865 6375 7469 t script executi
00000d0: 6f6e 2e20 5468 6973 2069 7320 7369 6d69 on. This is simi
00000e0: 6c61 7220 746f 0a20 2020 2077 6861 7420 lar to. what
00000f0: 7765 6273 6974 6573 206c 696b 6520 4d79 websites like My
0000100: 5370 6163 6520 646f 2074 6f20 6f62 6a65 Space do to obje
0000110: 6374 2074 6167 732e 2020 596f 7520 7368 ct tags. You sh
0000120: 6f75 6c64 2061 6c73 6f20 656e 6162 6c65 ould also enable
0000130: 0a20 2020 2025 4f75 7470 7574 2e46 6c61 . %Output.Fla
0000140: 7368 436f 6d70 6174 2069 6e20 6f72 6465 shCompat in orde
0000150: 7220 746f 2067 656e 6572 6174 6520 496e r to generate In
0000160: 7465 726e 6574 2045 7870 6c6f 7265 720a ternet Explorer.
0000170: 2020 2020 636f 6d70 6174 6962 696c 6974 compatibilit
0000180: 7920 636f 6465 2066 6f72 2079 6f75 7220 y code for your
0000190: 6f62 6a65 6374 2074 6167 732e 0a3c 2f70 object tags..</p
00001a0: 3e0a 2d2d 2320 7669 6d3a 2065 7420 7377 >.--# vim: et sw
00001b0: 3d34 2073 7473 3d34 0a =4 sts=4.
13 ответов:
обновление: согласно комментарию по этому вопросу, проблема была решена:
это просто: первый файл имеет CRLF-концы строк (windows), второй LF (Unix). Элемент
fileutil (доступно в git\usr\bin) покажет вам, что (file a bответим что-то вродеa: ASCII text, with CRLF line terminators b: ASCII text)оригинальный ответ ниже:
разница вы показываете делает не показать одну другую строку. Мочь ты постишь .в git/config (или лучше
git config -l).возможно, у вас есть некоторые пробелы игнорирует активирован
вы должны попытаться отключить
core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol;и
git show HEAD:myfile|md5sum md5sum myfileможет использоваться для проверки того, что файлы на самом деле разные. Использование внешнего diff может работать также
git show HEAD:myfile > /tmp/myfile.HEAD diff -u myfile /tmp/myfile.HEAD # or if you prefer an interactive tool like e.g.: vim -d myfile /tmp/myfile.HEAD
Я решил эту проблему, используя следующие stpes
1) Удалите каждый файл из индекса Git.
git rm --cached -r .2) перепишите индекс Git, чтобы забрать все новые окончания строк.
git reset --hardобратите внимание, что Шаг 2 может удалить ваши локальные изменения. Решение было частью шагов, описанных на сайте git https://help.github.com/articles/dealing-with-line-endings/
У меня была та же проблема. после win - >Lin copy у меня все файлы изменены.
я использовал fromdos чтобы исправить окончания строк
а потомgit add -uvдля добавления изменения.
он добавил 3 файла (не все из них), которые я фактически изменил. и после этого git status показывает только 3 измененные файлы. после git commit все в порядке со статусом git
вы изменили режим файлы? Я сделал это на своей машине, и локальная машина dev дала 777 всем файлам, тогда как РЕПО имело 755, которые показывали каждый файл как измененный. Я сделал
git diffи он показал, что старый режим и новый режим отличаются. Если это проблема, то вы можете легко игнорировать ихgit config core.filemode false
Ура
однако многие (если не все) файлы отображаются как измененные, даже если содержимое точно такое же.
С помощью git 2.8 (март 2016) вы сможете быстро проверить, связаны ли эти изменения с eol.
посмотреть commit a7630bd (16 янв 2016) by Торстен Bögershausen (
tboegi).
(слитый Junio C Hamano--gitster-- in совершить 05f1539, 03 февраля 2016)
ls-files: добавить Эол диагностикапри работе в кросс-платформенной среде пользователь может захотеть проверить, нормализованы ли текстовые файлы в репозитории и если
.gitattributesустановлены соответствующим образом.позвольте Git показать окончания строк в индексе и в рабочем дереве и эффективные атрибуты text/eol.
конец строки ("
eolinfo") показаны как это:"-text" binary (or with bare CR) file "none" text file without any EOL "lf" text file with LF "crlf" text file with CRLF "mixed" text file with mixed line endings.эффективный атрибут text/eol является одним из следующих:
"", "-text", "text", "text=auto", "text eol=lf", "text eol=crlf"
git ls-files --eolдает такой вывод:i/none w/none attr/text=auto t/t5100/empty i/-text w/-text attr/-text t/test-binary-2.png i/lf w/lf attr/text eol=lf t/t5100/rfc2047-info-0007 i/lf w/crlf attr/text eol=crlf doit.bat i/mixed w/mixed attr/ locale/XX.poчтобы показать, какое соглашение eol используется в данных в индексе ('
i'), и в рабочем дереве ('w'), и какой атрибут действует, для каждого пути, который показал.
я смог исправить проблемы на машине Windows, изменив ядро.autocrlf от ложного ядра.autocrlf=input
git config core.autocrlf inputкак это предлагается в https://stackoverflow.com/a/1112313/52277
в моем случае файлы были изменены после изменение прав доступа к файлам.
чтобы git игнорировал изменения разрешений, выполните следующие действия:
# For the current repository git config core.filemode false # Globally git config --global core.filemode false
на git FAQ есть ответ, который может быть актуальным, хотя я никогда не сталкивался с этим раньше:
почему git diff иногда перечисляет файл, который не имеет изменений?
git diff и другие операции git оптимизированы, поэтому он даже не смотрит на файлы, статус которых (размер, время модификации и т. д.) На диске и в индексе git отличаются. Это делает git diff чрезвычайно быстрым для небольших изменений. Если файл был затронут так или иначе, git diff должен смотреть на содержание и сравнивать его, что является гораздо более медленной операцией, даже когда на самом деле нет никаких изменений. git diff перечисляет файлы как напоминание о том, что он не используется оптимально. Запуск git status не только покажет статус, но и обновит индекс со статусом для неизмененных файлов диска, делая последующие операции, а не только diff, намного быстрее. Типичный случай, когда многие файлы перечисляются diff, - это выполнение команд массового редактирования, таких как perl-pi-e '...'.
что значит
git statusпоказать для вас?
после копирования моего локального репозитория и рабочей копии в другую папку (в Windows, кстати), у меня было четыре файла, которые продолжали отображаться как измененные и пробовали каждое предложение, указанное в других ответах. В конце концов, то, что исправило это для меня, удаляло локальную ветвь и загружало ее снова с пульта дистанционного управления. В моем случае, я думаю, это было как-то связано с копированием локального репозитория, а не клонированием.
Итак, я попробовал почти все здесь и хочу внести еще одно решение, которое исправило все мои проблемы. Мои проблемы не были с окончаниями строк или фактическими разрешениями или чем-то подобным. Это было потому, что я установил Cygwin и целый ряд вещей, которые поставляются с этим, которые без моего ведома также установили свою собственную версию git. Я никогда не замечал этого, просто у меня были странные проблемы с пользователями и файлами, помеченными как измененные (из-за завивки изменения.)
оказывается, я понял это, потому что я думал, что я должен просто обновить Git до последней версии, что я и сделал, но работает
git --versionвернул старый номер версии. После последующей охоты за why я нашел корень каталога cygwin bin в моем пути к среде, который содержал исполняемый файл git, работающий под старым номером версии. Иди разберись.Это также было трудно найти, потому что у меня установлен TortoiseGit. Мои инструменты командной строки будут использовать cygwin версия из-за ошибок пути, и TortoiseGit был настроен на использование версии windows, что делает его еще более запутанным.
надеюсь, это кому-то поможет.
вот как я исправил проблему на Linux, пока я клонировал проект, который был создан на Windows:
в linux для того, чтобы все работало правильно, вы должны иметь эту настройку: core.autocrlf=input
вот как это установить: git config -- global core.autocrlf input
затем снова клонируйте проект из github.
единственная подозрительная запись в вашей конфигурации выглядит для меня
core.ignorecase. Вы можете попробовать сбросить это с помощью:git config --unset core.ignorecase... и посмотреть, если выход из
git statusилиgit diff- разному.
Если у вас есть несколько ветвей и все изменения нажаты, то это решение может работать
просто добавьте и зафиксируйте все изменения, которые вы видите, в текущей ветке(скажем, master). Затем проверьте другую ветку (скажем, тест). Удалите главную ветвь локально (с параметром-D). Вытяните главную ветку из git
сделано.. !
Comments