Подтвердить что ты не робот

Git отказывается от reset/отбрасывает файлы

У меня есть проект с определенными js файлами, которые я не могу обновить. Я запускаю OSX локально, а мой удаленный/промежуточный сервер - Linux (CentOS).

Сразу после клонирования моего проекта локально, я заметил, что у меня есть все эти файлы с git status 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.
...
4b9b3361

Ответ 1

Нормализовать окончание строки

Изменение, которое находится в модификации, удаляет все строки и добавляет их снова.

Это связано с тем, что новые строки изменяются между зафиксированными файлами и файлами на диске.

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 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-machine

промежуточный сервер заблокирован, потому что он не будет вытаскивать новые изменения.

В сообщении об ошибке говорится: "Ваши локальные изменения в следующих файлах будут перезаписаны слиянием:", это означает, что они содержат локальные изменения, которые должны быть зафиксированы или отброшены перед продолжением. Предполагая, что обычное использование для промежуточного сервера (у него нет намеренных изменений), локальные изменения могут быть отброшены. Например, выполните следующие действия:

$ git fetch origin
# Retrieve updates

$ git reset --hard origin/master
# Forcibly change the current branch to match origin/master

Это приведет к восстановлению истории репозитория без обновления рабочей копии, а затем обновится, чтобы точно соответствовать основной ветке в репозитории. Обратите внимание, что последняя команда будет отбрасывать все незафиксированные изменения.

Ответ 2

Я всегда упоминал, что ваш core.autocrlf установлен на false, как в Git: застрял репо с помощью stash после нормализации crlf?"

git config --global core.autocrlf false

Также убедитесь, что у вас нет файла .gitattributes с директивами eol, которые будут пытаться преобразовать конец, из линий.
Основная идея: вы все еще видите это сообщение об ошибке, когда убедитесь, что существует автоматическое преобразование нет?


Но на всякий случай, рассмотрите также "Git rebase failed, "Ваши локальные изменения в следующих файлах будут перезаписаны слиянием" . Нет локальных изменений?"

Я нахожусь на mac, и это неясное изменение конфигурации, похоже, устранило все мои проблемы относительно неустановленных изменений, когда их не было.

git config --global core.trustctime false

Ответ 3

Я просто потратил 2 часа (!) на ту же проблему с файлом .svg(Scalar Vector Graphics), который продолжал меняться после "вернуть" без моего вмешательства.

Таким образом, файл отображается как измененный в 'git status'; но он продолжает меняться, поэтому 'pull' терпит неудачу снова и снова.... так раздражает!

Не повезло с 'git reset', 'git игнорировать', 'git untrack' и т.д....

Наконец, я решил это, удалив файл из моей локальной системы (не 'git delete', просто Shift + Delete) → теперь 'pull' запрос, и файл извлекается из удаленного репозитория.

Так легко, я мог плакать!

Ответ 4

Эта проблема неоднократно появлялась с репозиторием листы файлов 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?), A 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 между обработанными.