Git отказывается сбрасывать / сбрасывать файлы
У меня есть проект с определенными 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 config, чтобы он сортировал окончания строк для вас:
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
Это приведет к извлечению истории хранилища без обновления рабочей копии, а затем обновлению до точного соответствия главной ветви в хранилище. Обратите внимание, что последняя команда отменит все незафиксированные изменения.
Я просто потратил 2 часа (!) На ту же проблему с файлом.svg (Scalar Vector Graphics), который менялся после "возврата" без моего вмешательства.
Таким образом, файл отображается как измененный в "git status"; вернуть его удается, но он продолжает меняться, поэтому "тянуть" снова и снова не удается... так раздражает!
Не повезло с "git reset", "git ignore", "git untrack" и т. Д.
Наконец, я решил эту проблему, удалив файл из моей локальной системы (не "git delete", просто Shift + Delete) >> теперь запрос "pull" проходит, и файл выбирается из удаленного репозитория.
Так легко, я мог плакать!
Я всегда упоминал, чтобы убедиться, что ваш core.autocrlf
установлен в false
, как в " Git: застрял репо с использованием stash после нормализации crlf? "
git config --global core.autocrlf false
Также убедитесь, что у вас нет .gitattributes
файл с eol
директивы, которые будут пытаться преобразовать конец строки.
Основная идея такова: вы все еще видите это сообщение об ошибке, когда убедитесь, что нет никакого автоматического преобразования какого-либо рода?
Но на всякий случай учтите также: " Git rebase не работает," Ваши локальные изменения в следующих файлах будут перезаписаны слиянием ". Никаких локальных изменений? "
Я работаю на Mac, и это неясное изменение конфигурации, казалось, исправило все мои неприятности относительно неустановленных изменений, когда их не было.
git config --global core.trustctime false
Эта проблема неоднократно появлялась в хранилище листов символов Roll20 на машине с Ubuntu, и я мог решить ее,
#!/bin/sh
# Use in root dir of git repository
# Fixes some newline-related weirdness
git rm --cached -r .
git reset --hard
Но это прекратило полностью решать проблему сегодня, и, осмотрев Stack Overflow, я обнаружил, что виновником их .gitattributes
файл:
# 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 все равно останется доволен.
Редактировать + 1d: повторил "трюк".gitattributes сегодня, но не сделал git status
перед отменой изменений.gitattributes. Без причины, очевидной для меня (возможно, кеширование git status
?) 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")
Делать это снова, но с git status
между ними работал.