私は同様の質問をすべて見てきましたが、私は二重にチェックしました、そして奇妙なことが間違いなく起こっています。
1台のサーバー(git 1.8.1を使用するSolaris)で、gitリポジトリを複製し、.gitフォルダーを既存のライブファイルにコピーしました。これは完璧に機能し、実行できました
git status
それから
git diff [filename]
異なるファイルをチェックします。
ただし、別のサーバー(git 1.7.6を搭載したSolaris)でもまったく同じことをしています
git diff [filename]
ファイルの内容が明確に異なっていても、何も表示されません。また、新しいファイルを追加し、コミットしてから編集することもテストしました。同じ問題、git status
は変更されたファイルを表示しますが、git diff
は何も表示しません。変更したファイルをダウンロードしてローカルでdiffを実行すると、diff出力が得られます。
ファイルを index に追加しました:
git add file_name
その後、実行しました:
git diff --cached file_name
Git diff here の説明を見ることができます。
Git addを取り消す必要がある場合は、こちらを参照してください。 コミット前に「git add」を取り消す方法は?
git status
が違いを示すのにgit diff
が違いを示さない理由はいくつかあります。
ファイルのモード(許可ビット)が変更されました(たとえば、777から700)。
改行スタイルがCRLF(DOS)からLF(UNIX)に変更されました
何が起こったのかを知る最も簡単な方法は、git format-patch HEAD^
を実行して、生成されたパッチの内容を確認することです。
私にとっては、ファイルのアクセス許可と関係がありました。私のプロジェクトでMac/Linuxを使用している人が、Windowsのgitクライアントが再現に失敗したデフォルト以外の権限を持つファイルをコミットしているようです。私の解決策は、ファイルのアクセス許可を無視するようにgitに指示することでした:
git config core.fileMode false
何百もの行末が何らかのプログラムによって変更され、git diffがすべてのソースファイルを変更済みとしてリストする問題がありました。行末を修正した後も、git statusは変更されたファイルをリストします。
すべてのファイルをインデックスに追加してからインデックスをリセットすることで、この問題を修正できました。
git add -A
git reset
core.filemode
はfalseに設定されました。
Gitのインストールまたはリポジトリに問題があると思われます。
実行してみてください:
GIT_TRACE=2 git <command>
何か役に立つものがあるかどうかを確認してください。それでも解決しない場合は、ただトレースして何が間違っているのかを確認してください。
strace git <command>
同様の問題がありました。git diff
は違いを示しますが、git diff <filename>
は違いを示しません。 LESS
に-F
(--quit-if-one-screen
)を含む文字列を設定したことがわかりました。そのフラグを削除することで問題は解決しました。
この問題に遭遇しました。私のケースは、@ rcwxokが投稿したLESS
の問題に似ていました。
私の場合、PAGER
環境変数をPAGER='less -RSF'
に設定します。
ただし、前の回答とは異なり、-F
オプションを削除したくありませんでした。スクリーンフルより短い場合、less
に差分が表示されないように明示的にそこに配置したからです。
-F
を削除する代わりに、目的の結果を得るために、-X
:PAGER='less -RSFX'
を追加しました。これにより、git diff
の問題が解決され、さらにless
で短い差分が表示されなくなりました。
これが誰かを助けることを願っています。
git add
を実行すると役立つ場合があります。
Gitステータスには変更されたファイルが表示され、git diffには何も表示されません...
> git status
On branch 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: package.json
no changes added to commit (use "git add" and/or "git commit -a")
> git diff
>
... git addを実行すると、矛盾が解決されます。
> git add
> git status
On branch master
nothing to commit, working directory clean
>
同様の問題が発生しました。 git diff file
は、名前の一部を大文字でgitインデックスに追加したため、何も表示されませんでした:GeoJSONContainer.js
。その後、名前をGeoJsonContainer.js
に変更し、変更の追跡を停止しました。 git diff GeoJsonContainer.js
は何も表示していませんでした。強制フラグを使用してインデックスからファイルを削除し、ファイルを再度追加する必要がありました。
git rm -f GeoJSONContainer.js
git add GeoJSONContainer.js
あなたは実際に質問をしませんでしたが、これは一般的な使用例なので、私は頻繁に使用しています。これを自分で試して、エラーが続くかどうかを確認できます。
あなたのユースケースに関する私の仮定:ファイルとディレクトリを含む既存のディレクトリがあり、それを他の場所からクローンされたgitリポジトリに変換したいwithout現在のディレクトリ内のデータを変更します。
本当に2つの方法があります。
クローンリポジトリ-mv .git
-git reset --hard
この方法はあなたがしたことです-既存のリポジトリを空のディレクトリにクローンし、.git
dirを宛先ディレクトリに移動します。問題なく動作するためには、一般的にこれを実行する必要があります
git reset --hard
ただし、現在のディレクトリ内のファイルの状態が変更されます。ディレクトリのフルコピー/ rsyncでこれを試して、どのような変更があるかを調べることができます。少なくともその後は、git log
とstatus
の間に矛盾が見られなくなるはずです。
Init new repo-Originをポイント
2番目の方法はそれほど邪魔になりません。目的地にcdし、新しいレポジトリを開始します
git init
次に、新しいレポに、他の場所に祖先があることを伝えます。
git remote add Origin original_git_repo_path
その後、安全に
git fetch Origin master
ローカルファイルを変更せずにデータをコピーします。これですべてが正常になります。
エラーが発生しにくい2番目の方法を常にお勧めします。
次のように説明したのと同じ問題がありました:入力した場合
$ git diff
gitはエラーなしで単にプロンプトに戻りました。
入力した場合
$ git diff <filename>
gitはエラーなしで単にプロンプトに戻りました。
最後に、Git diffが実際にmingw64\bin\diff.exeを呼び出して作業を実行していることに気付きました。
これが取引です。私はWindowsを実行しており、別のbashユーティリティをインストールしていたので、パスが変更されたため、mingw64\binディレクトリを指すことはなくなりました。
したがって、次のように入力すると、git diffがプロンプトに戻るだけで、この問題が発生する可能性があります。
Gitによって実行される実際のdiff.exeは、mingw64\binディレクトリにあります。
最後に、これを修正するために、実際にmingw64\binディレクトリをgitが探していた場所にコピーしました。試してみましたが、まだ動作しませんでした。
それから、git bashウィンドウを閉じて再度開き、失敗した同じリポジトリに移動しましたが、現在は動作しています。
これがあなたにも役立つことを願っています。
私は再びこの問題に出くわしました。しかし、今回は別の理由で発生しました。以前のバージョンを上書きするために、リポジトリにファイルをコピーしました。これで、ファイルが変更されていることがわかりますが、diffはdiffを返しません。
たとえば、mainpage.xamlファイルがあります。エクスプローラーで、現在のレポジトリにある新しいmainpage.xamlファイルを貼り付けました。別のマシンで作業を行い、ファイルをここに貼り付けました。
ファイルは変更されたと表示されますが、git diffを実行すると、変更は表示されません。これはおそらく、ファイルのfileinfoが変更されており、gitが実際には同じファイルではないことを知っているためです。面白い。
ファイルでdiffを実行すると、何も表示されず、プロンプトが返されるだけであることがわかります。
上記 で既に述べたように、この状況は行末の問題(CRLFとLF)により発生する可能性があります。このコマンドでこの問題を解決しました(gitバージョン2.22.0の下):
git add --renormalize .
マニュアルによると:
--renormalize
Apply the "clean" process freshly to all tracked files to
forcibly add them again to the index. This is useful after
changing core.autocrlf configuration or the text attribute in
order to correct files added with wrong CRLF/LF line endings.
This option implies -u.