ГИТ отказывается от возврата/удаления файлов
у меня есть проект с определенными файлами js, которые я не могу обновить. Я запускаю OSX локально, а мой удаленный/промежуточный сервер-Linux (CentOS).
сразу после клонирования моего проекта локально, я заметил, что у меня есть все эти файлы со статусом git modified
. Я никогда не изменял их, поэтому я пытался discard changes
или reset
их, но они приходят снова. Изменение, которое находится в модификации, удаляет все строки и добавляет их снова.
Я не уверен, почему это происходит или как это исправить так что мой статус git чист, как и должно быть.
вот несколько строк из статуса git:
# modified: app/webroot/js/ckeditor/plugins/devtools/lang/el.js
# modified: app/webroot/js/ckeditor/plugins/devtools/lang/fa.js
# modified: app/webroot/js/ckeditor/plugins/devtools/lang/gu.js
обновление 1:
теперь мне удалось зафиксировать вышеуказанные файлы, но промежуточный сервер заблокирован, потому что он не будет вытаскивать новые изменения:
error: Your local changes to the following files would be overwritten by merge:
app/webroot/js/ckeditor/_source/lang/ar.js
app/webroot/js/ckeditor/_source/lang/bg.js
app/webroot/js/ckeditor/_source/lang/bn.js
app/webroot/js/ckeditor/_source/lang/cs.js
...
Aborting
Я не могу совершить / нажать, потому что:
Updates were rejected because a pushed branch tip is behind its remote counterpart
пробовал:
git reset --hard
и
git stash
git stash drop
но они не работают, ничего не происходит.
обновление 2:
git diff
дает мне:
The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/fa.js.
The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/gu.js.
The file will have its original line endings in your working directory.
...
4 ответа:
нормализовать окончания строк
изменение, которое находится в модификации, удаляет все строки и добавляет их снова.
это связано с тем, что новые строки изменяются между зафиксированными файлами и файлами на диске.
Github имеет удобная страница подробно описывая, как справиться с такой проблемой, вкратце (для linux/OSX), Шаг первый-изменить конфигурацию git, чтобы она сортировала окончания строк для ты:
git config --global core.autocrlf input
затем зафиксируйте нормализацию окончаний строк:
git rm --cached -r . # Remove everything from the index. git reset --hard # Write both the index and working directory from git's database. git add . # Prepare to make a commit by staging all the files that will get normalized. # This is your chance to inspect which files were never normalized. You should # get lots of messages like: "warning: CRLF will be replaced by LF in file." git commit -m "Normalize line endings" # Commit
и затем, окончания строк должны быть обработаны правильно. Дополнительную информацию см. На странице справки на github или в соответствующем разделе git docs форматирование и пробелы.
разрешение конфликтов linux-машины
промежуточный сервер заблокирован, потому что он не потянет новые правки.
сообщение об ошибке гласит: "Ваши локальные изменения чтобы следующие файлы были перезаписаны слиянием:", это означает, что они содержат локальные изменения, которые должны быть либо зафиксированы, либо отброшены перед продолжением. Предполагая нормальное использование для промежуточного сервера (у него нет никаких преднамеренных изменений), локальные изменения могут быть отброшены. Например, выполните следующие действия:
$ git fetch origin # Retrieve updates $ git reset --hard origin/master # Forcibly change the current branch to match origin/master
это позволит получить историю репозитория, не обновляя рабочую копию, а затем обновить, чтобы точно соответствовать главной ветви в репозитории. Заметить что последняя команда отменит все незафиксированные изменения.
Я всегда упоминал, что ваш
core.autocrlf
установлено значениеfalse
, в "Git: застрял РЕПО с использованием тайника после нормализации crlf?"git config --global core.autocrlf false
также убедитесь, что у вас нет
.gitattributes
Сeol
директивы, которые будут пытаться конвертировать окончания строк.
Основная идея: вы все еще видите это сообщение об ошибке, когда вы убедитесь, что есть нет автоматическое преобразование любых сорт?
но на всякий случай рассмотрите также "git rebase не удается, "ваши локальные изменения в следующих файлах будут перезаписаны слиянием". Никаких локальных изменений?"
Я на mac, и это неясное изменение конфигурации, казалось, исправило все мои беды в отношении нестагированных изменений, когда их не было.
git config --global core.trustctime false
Я только что провел 2 часа (!) по тому же вопросу с .svg-файл (скалярная векторная графика), который продолжал меняться после 'revert' без моего вмешательства.
таким образом, файл отображается как измененный в 'git status'; возврат его удается, но он продолжает меняться, так что 'pull' терпит неудачу снова и снова.... так раздражает!
Не повезло с 'git reset', 'git ignore', 'git untrack' так далее...
наконец, я решил его, удалив файл из моей локальной системы (не 'git delete', просто Shift + Delete) > > сейчас 'pull' запрос проходит, и файл извлекается из удаленного репозитория.
так легко, я мог бы плакать!
эта проблема неоднократно всплывала с репозиторием Roll20 character sheets на машине Ubuntu, и я мог бы решить ее с помощью
#!/bin/sh # Use in root dir of git repository # Fixes some newline-related weirdness git rm --cached -r . git reset --hard
но, это перестало решать проблему полностью сегодня, и, оглядев переполнение стека, я обнаружил, что виновником является их
.gitattributes
file:# Auto detect text files and perform LF normalization * text=auto
после
git pull origin master
,git status
вернулся:On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: Star Wars Revised RPG/SWRRPG-updated.html no changes added to commit (use "git add" and/or "git commit -a")
решение было убрать
* text=auto
линия от .gitattributes:$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: .gitattributes no changes added to commit (use "git add" and/or "git commit -a")
в изменения на
.gitattributes
можно отбросить, и Git все равно будет удовлетворен.Edit +1d: повторил .gitattributes "трюк" сегодня, но не
git status
перед выкидыванием .gitattributes по изменениям. Без видимой для меня причины (возможно, кэшированиеgit status
?), agit status
потом вернулся снова:On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: Star Wars Revised RPG/SWRRPG-updated.html no changes added to commit (use "git add" and/or "git commit -a")
сделать это снова, но с
git status
между ними работал.