'git status' değiştirilmiş dosyaları gösterir, ancak 'git diff' gösterilmez


181

Benzer sorulara bir göz attım. Ancak, iki kez kontrol ettim ve garip bir şey kesinlikle oluyor.

Bir sunucuda (Git 1.8.1 ile Solaris) Git deposunu kopyaladım ve .git klasörünü mevcut canlı dosyalarıma kopyaladım. Bu mükemmel çalıştı, koşabilirdim

git status

sonra

git diff [filename]

farklı dosyaları kontrol etmek için.

Başka bir sunucuda (Git 1.7.6 ile Solaris)

git diff [filename]

dosya içeriği kesinlikle farklı olsa bile hiçbir şey göstermez. Ayrıca yeni bir dosya eklemeyi, yürütmeyi ve sonra düzenlemeyi de test ettim. Aynı sorun, git statusdosyayı değiştirilmiş olarak git diffgösterir , ancak hiçbir şey göstermez. Değişen dosyayı indirir ve yerel olarak bir fark çalıştırırsam fark çıktısı alırım.


9
Endeksinizde mi? Eğer öyleyse, farkı ile görüntüleyebilirsiniz git diff --cached.
jeremyharris

2
git diff --cachedbana da boş çıktı veriyor.
Oliver P

git logayrıca çıktı vermez.
Oliver P

Gerçekten bir hata olduğunu varsayarsak, minimal bir örnek oluşturabilirsiniz. Yeniden oluşturmaya çalışın ve örneği paylaşın.
mheinzerling

1) Dosya modu değiştirildi mi? Buradacore.fileMode seçenek arayın 2) Ayrıca, Console2 gerçekten çalışırken Console2 config (git altında var) ile benzer bir sorunla karşı karşıyayım. Belki bir dosya kilidi tür dosya değişti şey git yapar.
madhead

Yanıtlar:



63

git statusBir fark göstermesinin ancak göstermemesinin birkaç nedeni vardır git diff.

  • Dosyanın modu (izin bitleri) değişti - örneğin, 777'den 700'e.

  • Satır besleme stili CRLF'den (DOS) LF'ye (UNIX) değiştirildi

Ne olduğunu bulmanın en kolay yolu koşmak git format-patch HEAD^ve üretilen yamanın ne dediğini görmektir.


11
değişiklik izin dosyaları geçerliyse: git config core.filemode dosyaların izinlerini yoksaymak için false
jruzafa

Satır feed'inin CRLF'den LF'ye değişmesinin git durumunun bir fark göstereceği ve git farkının olmayacağı durumlardan biri olduğunu nasıl buldunuz?
Alex Spurling

Windows'u kullanan iş arkadaşlarınız olması, satır sonlarıyla ilgili her türlü eğlenceli şeyi bulmanıza yardımcı olacaktır. Bence "git diff", CRLF'den LF'ye değişiklik gösterdiği durumlar olabilir - muhtemelen yapılandırmanıza bağlıdır. Bir süredir Windows ile çalışmadım, bu yüzden varsayılanların nasıl olduğunu bilmiyorum.
cmccabe

59

Benim için dosya izinleri ile ilgisi vardı. Projemde Mac / Linux bulunan biri, Windows git istemcimin yeniden üretemediği varsayılan olmayan izinlere sahip bazı dosyalar yürütüyor gibi görünüyor. Benim için çözüm git'e dosya izinlerini yoksaymasını söylemekti:

git config core.fileMode false

Diğer bilgiler: Git'in dosya modu (chmod) değişikliklerini yoksaymasını nasıl sağlayabilirim?


Bunun yerine bir sürü dosya ile yaşadım bir sorunu çözdü, ancak bunun yerine oluşturulan / değiştirilen zaman ile olduğunu düşünüyorum.
Derek

Bu benim için çözdü. FileMode değeri Mac / Linux birimlerinde varsayılan olarak true, Windows birimlerinde false olarak görünür. Bir projeyi Mac'ten Windows'a taşıdım ve yanlış olarak değiştirilmesi gerekiyordu.
geekinit

1
Bu, VSCode'u dizininizi Windows 10'a bağlayan bir Docker kapsayıcısı kullanarak çalıştırıyorsanız da yardımcı oldu. Kabın dışında, git durumunu kontrol etmek, herhangi bir dosyayı değiştirmediğinizi doğru bir şekilde gösterir. Ancak konteynerin içindeki git durumunu kontrol ederseniz, dosyaların değiştirildiğini gösterir. Konteyner içinde yukarıdaki komutu çalıştırmak sorunumu çözdü.
Frederick Ollinger

39

Yüzlerce satır sonu bazı program tarafından değiştirildi ve git difftüm kaynak dosyaları değişti olarak listelenen bir sorun vardı . Satır sonlarını düzelttikten sonra git status, dosyaları değiştirilmiş olarak listeledi.

Tüm dosyaları dizine ekleyip dizini sıfırlayarak bu sorunu giderebildim.

git add -A
git reset

core.filemode false değerine ayarlandı.


Teşekkür ederim! Bir cazibe gibi çalıştı!
Starwave

1
Çözdüm git add --renormalize ., cevabımı aşağıya bakın.
Stefano M

17

Git kurulumunuzda veya deponuzda yanlış bir şey olduğundan şüpheleniyorum.

Koşmayı deneyin:

GIT_TRACE=2 git <command>

Yararlı bir şey alıp almadığınızı görün. Bu yardımcı olmazsa, strace kullanın ve neyin yanlış gittiğini görün:

strace git <command>

6
@towi: Bu sizin için bir nimet değerinde olduğundan, benzer başarısızlıklarınızın nedeni hakkında ne öğrendiğinizi görmek isterim.
cfi

5
Benim durumumda, env değişkenine, gösterilecek bilgi dolu birden fazla ekran varsa çıkıştan daha azını bildiren -Fbayrağı ekledim LESS. Git çağrı cihazı olarak daha az kullandığından ve küçük bir farkım olduğu için hiçbir şey gösterilmiyordu. Ya ben eklemek zorunda -Xiçin LESSdaha az çıkar sonra ekranda içeriğini gösterir env ya da sadece kaldırmak -F. GIT_TRACEgösterdiği lessDeğiştim hatırlattı hangi infaz ediliyordu LESSgeçenlerde değişkeni. Aynı neden @ rcwxok'un cevabında, ama nasıl GIT_TRACEyardımcı olduğu hakkında yorum yapmak istedi .
Raghu Dodda

Bu cevap bana "çağrı cihazı" ve potansiyel beni bir ipucu sağlar çözümü ayarı core.pageriçinde .gitconfigmükemmel benim için çalışıyor.
ytu

10

Benzer bir sorunum vardı: git difffarklılıklar gösterirdi, ama göstermezdim git diff <filename>. ( ) LESSİçeren bir dizeye ayarladığım ortaya çıktı . Bu bayrağı kaldırmak sorunu çözdü.-F--quit-if-one-screen


1
Kaldırmak yerine -F, ekleme -Xde işe yarayabilir, benzer bir durum için aşağıdaki cevabımı inceleyin.
avivr

Bunun için teşekkür ederim! Beni delirtiyordu.
hackel

9

Önceki bir cevapta daha önce belirtildiği gibi , bu durum hat sonu sorunları (CR / LF ve LF) nedeniyle ortaya çıkabilir. Bu komutla (Git sürüm 2.22.0 altında) bu sorunu çözdüm:

git add --renormalize .

El kitabına göre:

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

Bu yeni en iyi cevap.
PHPst

5

Kısa cevap

Koşmak git addbazen yardımcı olur.

Misal

Git durumu değiştirilmiş dosyaları gösteriyor ve git diff hiçbir şey göstermiyor ...

> 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 komutunu çalıştırmak tutarsızlığı giderir.

> git add
> git status
On branch master
nothing to commit, working directory clean
> 

2
Bu bana 'hastalığı tedavi etmek' yerine 'semptomlarla savaşmak' gibi geliyor ...;)
einjohn

@einjohn Sizce bu durumda hastalık nedir?
Shaun Luttin

1
Hastalık birkaç şey olabilir. Başkaları tarafından belirtildiği gibi, bir izin sorunu veya satır sonlarıyla ilgili bir şey olabilir. Ayrıca önceden hazırlanmış değişiklikler de olabilir. Ancak, bu son olasılık örneğinize uymuyor. Bununla birlikte, çözümünüzle nedeni (hastalık) bilmeyeceksiniz, sadece sorunu ortadan kaldırıyorsunuz (görünüşte hatalı bir boş fark (belirtiler)). Açık olmak gerekirse: Bunun kötü bir çözüm olduğunu söylemiyorum. Eğer problemin ortadan kalkmasını isterse birisine yardımcı olabilir. ... umarım hastalık metaferime biraz ışık tutmuşumdur. :)
einjohn

@einjohn Çoğu zaman satır sonları gibi görünüyor. Bunları ele almak gibi görünüyor statusve diffayrı yolları var.
Shaun Luttin

5

Bu sorunla karşılaştım. Davam benziyordu rcwxok tarafından gönderildi sorunu .LESS

Benim durumumda, PAGERortam değişkenini olarak ayarladım PAGER='less -RSF'.

Ancak, önceki cevapların aksine, -Fseçeneği kaldırmak istemedim , çünkü açıkça lessbir taramadan daha kısa ise farkın gösterilmesini önlemek umuduyla koydum .

Yerine kaldırılması, istenen sonucu elde etmek için -F, ben ekledi -X: PAGER='less -RSFX'. Bu hem sorunu çözdü hem de git diffkısa farkların gösterilmesini önler less.


Büyük harf kullanımı garip görünüyor. Şunu mu demek istediniz: "LESS -RSFX" yerine "daha az -RSFX"? Seçenekler doğru durum mu?
StackzOfZtuff

1
Evet, teşekkürler, bu bir hataydı. Nasıl olduğundan emin değilim. Şimdi düzeltildi.
avivr

3

Ben de benzer bir sorunla karşılaştım. git diff fileBen büyük harfle adının bir kısmı ile Git endeksine dosyayı eklendi çünkü hiçbir şey gösterdi: GeoJSONContainer.js.

Daha sonra yeniden adlandırdım GeoJsonContainer.jsve değişiklikler izlenmeyi bıraktı. git diff GeoJsonContainer.jshiçbir şey göstermiyordu. Bir kuvvet bayrağı ile dizinden dosyayı kaldırmak ve dosyayı yeniden eklemek zorunda kaldı:

git rm -f GeoJSONContainer.js
git add GeoJSONContainer.js

2

Gerçekten gerçek bir soru sormadınız, ancak bu genel bir kullanım örneği olduğundan sık sık kullanıyorum işte burada. Bunu kendiniz deneyebilir ve hatanın devam edip etmediğini görebilirsiniz.

Kullanım durumunuzla ilgili varsayımım:

Sen dosya ve dizinleri içeren mevcut bir dizin var ve şimdi başka bir yerden klonlanmış bir Git depo haline dönüştürmek istediğiniz olmadan mevcut dizindeki herhangi bir veri değiştirme.

Gerçekten iki yol var.

Klon .gitReposu - MV - Git Reset --hard

Bu yöntem, yaptığınız yöntemdir - varolan havuzu boş bir dizine kopyalamak ve .gitdizini hedef dizine taşımak için . Sorunsuz çalışmak için bu genellikle koşmanızı gerektirir

git reset --hard

Ancak bu, geçerli dizininizdeki dosyaların durumunu değiştirir. Bunu dizininizin tam bir kopyasında / rsync üzerinde deneyebilir ve nelerin değiştiğini inceleyebilirsiniz. En azından daha sonra artık git logve arasındaki tutarsızlıkları görmemelisiniz status.

Yeni havuzu başlat - başlangıç ​​noktası

İkincisi daha az rahatsız edicidir: cdhedefinize ve yeni bir depoya başlayın

git init

Sonra yeni deponun, başka bir yerde bir atası olduğunu söylersiniz:

git remote add origin original_git_repo_path

Sonra güvenle

git fetch origin master

yerel dosyalarınızı değiştirmeden verileri kopyalamak için. Şimdi her şey iyi olmalı.

Her zaman daha az hataya eğilimli olmak için ikinci yolu tavsiye ederim.


Bunun bir git hatası olduğunu ima ediyorsunuz . Tamam, olabilir. Hala doğru git anlayışından yoksun olduğumu varsaydım, çünkü Linus ;-)
towi

@towi: Hayır, bunun bir git hatası olduğunu veya tam tersini ima etmiyorum. Git içlerine aşina değilim. Ancak genel bir kural olarak, .gitklasörlerin etrafında diğer çalışma alanlarına hareket ederek, git'in varsayımlarını potansiyel olarak ihlal ediyoruz. Bu düzensiz davranışlarla sonuçlanırsa git'i suçlayamayız, git ile hileler oynamak için kendimizi suçlamalıyız. git bunu düzeltmek için araçlar sağlar reset --hard. Sadece istediğimiz bu değil. Bu tam olarak init/remote addyolun önerilmesinin sebebidir ve her şey yolundadır.
cfi

@towi ve Oliver P: Özel hata durumunuzun çözülmesini istediğinizi anlasam da, bazen genel önerilere gitmeniz önerilir - özellikle kullanım durumunuza mükemmel şekilde uyuyorlarsa. Ayrıca veri kaybı da yoktur. Ve remote addişleri yapmanın yolu, Oliver P
cfi'nin

1
Yorum içermeyen bir aşağı oy, bu cevabı veya bir bütün olarak siteyi geliştirmeye yardımcı olmaz. Kim indirirse, sorunun çözülebilmesi için lütfen bir yorum bırakın.
cfi

1

Bu sorunla tekrar karşılaştım. Ancak bu sefer farklı bir nedenden dolayı meydana geldi. Önceki sürümlerin üzerine yazmak için dosyaları depoya kopyalamıştım. Şimdi dosyaları değiştirilmiş görebilirsiniz ama diff diffs döndürmüyor.

Örneğin, bir mainpage.xaml dosyam var. Dosya Gezgini'nde, geçerli depomdaki dosyanın üzerine yeni bir mainpage.xaml dosyası yapıştırdım. İşi başka bir makinede yaptım ve dosyayı buraya yapıştırdım.
git değiştirildi gösterir

Dosya değiştirilmiş gösterir, ancak git diff'i çalıştırdığımda değişiklikleri göstermez. Muhtemelen dosyadaki fileinfo değişti ve git bunun aynı dosya olmadığını biliyor. İlginç.

git diff hiçbir şey göstermiyor

Dosyada diff çalıştırdığımda hiçbir şey göstermediğini, sadece istemi döndürdüğünü görebilirsiniz.


1

Ben aynı sorunu aşağıdaki şekilde tarif vardı: Ben yazdıysanız

$ git diff

Git komut istemine hatasız olarak döndü.

Yazsaydım

$ git diff <filename>

Git komut istemine hatasız olarak döndü.

Son olarak, etrafı okuyarak işi yapmak için git diffgerçekten çağırdığını fark ettim mingw64\bin\diff.exe.

İşte anlaşma. Windows çalıştırıyorum ve başka bir Bash yardımcı programı yüklemişti ve artık benim mingw64 \ bin dizinine işaret etmeyecek şekilde yolumu değiştirdi .

Yani şunu yazarsanız:

git diff

ve bu sorunla karşılaşabileceğiniz bilgi istemine geri döner.

Tarafından çalıştırılan gerçek diff.exe git, mingw64 \ bin dizininizde bulunur

Son olarak, bunu düzeltmek mingw64\biniçin, dizinimi Git'in aradığı konuma kopyaladım . Denedim ve hala işe yaramadı.

Sonra Git Bash penceremi kapattım ve tekrar açtığım aynı depoya gittim ve şimdi çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.