web-dev-qa-db-ja.com

Gitはファイルのリセット/破棄を拒否します

更新できない特定の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.
...
74
mgPePe

行末を正規化する

変更にある変更は、すべての行を削除してから再度追加することです。

これは、コミットされたファイルとディスク上のファイルの間で改行が変更されているためです。

Githubには 便利なページ があり、この種の問題に対処する方法を詳しく説明しています(Linux/OSXの場合)、ステップ1は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 formatting and whitespace の関連セクションを参照してください。

Linux-machineの競合の解決

ステージングサーバーは、新しい編集をプルしないためロックされます。

エラーメッセージには、「次のファイルへのローカル変更はマージによって上書きされます」と表示されます。つまり、続行する前にコミットまたは破棄する必要があるローカル変更が含まれています。ステージングサーバーの通常の使用状況(意図的な変更がない場合)を想定すると、ローカルの変更は破棄できます。たとえば、次のことを行います。

$ git fetch Origin
# Retrieve updates

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

これにより、作業コピーを更新せずにリポジトリの履歴が取得され、リポジトリ内のmasterブランチと完全に一致するように更新されます。最後のコマンドは、コミットされていない変更をすべて破棄することに注意してください。

104
AD7six

私はいつもあなたのcore.autocrlfは「 Git:crlf正規化後にstashを使用してリポジトリをスタックしましたか? 」のようにfalseに設定されます

git config --global core.autocrlf false

また、 .gitattributes 行末を変換しようとするeolディレクティブを含むファイル。
基本的な考え方は、noあらゆる種類の自動変換があることを確認したときに、そのエラーメッセージが表示されることです。


ただし、念のため、「 Gitリベースが失敗し、「次のファイルへのローカル変更はマージによって上書きされます」。ローカル変更はありませんか? "

私はMacを使用していますが、このあいまいな構成の変更は、ステージングされていない変更に関するすべての問題を解決したようです。

git config --global core.trustctime false
14
VonC

.svgファイル(Scalar Vector Graphics)の同じ問題に2時間(!)を費やしましたが、介入なしで'revert'の後に変化し続けました。

そのため、ファイルは'git status'で変更された状態で表示されます。元に戻すことは成功しますが、変化し続けるため、'pull'は何度も失敗します。

'git reset''git ignore''git untrack'などでは運がありません...

最後に、ローカルシステムからファイルを削除して解決しました('git delete'ではなく、Shift + Deleteのみ)>> 'pull'リクエストパスファイルはリモートリポジトリから取得されます。

とても簡単に、私は泣くことができました!

9
Naor Bar

この問題は、UbuntuマシンのRoll20キャラクターシートリポジトリで繰り返し発生しました。

#!/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")

解決策は、.gitattributesから* text=auto行を削除することでした。

$ 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を「トリック」して今日再試行しましたが、.gitattributesの変更を破棄する前にgit statusしませんでした。私には明らかな理由はありませんが(おそらく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の中間で機能した。

4
Kreuvf