Git'teki etiketsiz değişikliklerden “eski mod 100755 yeni mod 100644” diyen dosyaları nasıl kaldırabilirim?


724

Bazı nedenlerden dolayı, başlangıçta benim bir git projesi için depodan bir çekim yaptığımda, çalışma kopyamda kendisinde fark edilebilir bir değişiklik yapılmayan bir ton dosyam var, ancak bölgemde görünmeye devam ediyorum unstaged changes.

Windows xp'de Git Gui kullanıyorum ve nelerin değiştiğini görmek için dosyaya baktığımda. Tüm gördüğüm:

old mode 100755  
new mode 100644  

Bunun ne anlama geldiğini bilen var mı?

Bu dosyaları yerleştirilmemiş değişiklikler listemden nasıl çıkarabilirim? (Son zamanlarda düzenlediğim ve taahhüt etmek istediğim dosyaları seçmek için 100'lü dosyadan geçmek çok can sıkıcı).

Yanıtlar:


1287

Bu bana unix dosyası izin modları gibi görünüyor ( 755= rwxr-xr-x, 644= rw-r--r--) - eski mod + x (yürütülebilir) bayrağı içeriyordu, yeni mod değil.

Bu msysgit sorununun yanıtları , sorundan kurtulmak için core.filemode öğesinin false olarak ayarlanmasını önerir:

git config core.filemode false

132
+1. Bu, git, teslim alınan dosyalarda yürütülebilir biti doğru şekilde ayarlayabileceğini düşündüğü anlamına gelir, ancak bunu yapmaya çalıştığında işe yaramaz (veya en azından okuyabileceği şekilde). Daha sonra bu dosyaların durumunu okuduğunda, yürütülebilir bit kasıtlı olarak ayarlanmamış gibi görünüyor. Core.filemode öğesini false olarak ayarlamak, git'e dosya sistemindeki yürütülebilir bit değişikliklerini yoksaymasını söyler, böylece bunu bir değişiklik olarak görmez. Yürütülebilir bir bit değişikliği yapmanız gerekiyorsa, bu, el ile yapmanız gerektiği anlamına gelir git update-index --chmod=(+|-)x <path>.
CB Bailey

7
Benim gibi, mod değişiklikleri önemliyse, core.filemode öğesini false olarak ayarlayabilir, gerçek kod değişikliklerinizi gerçekleştirebilir ve sonra core.filemode öğesini true olarak ayarlayabilirsiniz; git dosya değişikliklerini koruyacaktır.
Michael T. Smith

8
Aynı sorun var, ama aynı git repro SSH git cmd hattı üzerinden ve Windows'da eşlenen bir sürücüde Git Uzantıları kullanarak oldu! . . Çözüm aynıydı, "config" [core] filemode = false içine eklendi
Ian Vaughan

2
Bu bir hayat kurtarıcıydı, teşekkürler efendim! Ortak klasörde klonlanmış bir depo paylaştıktan ve dosyalar için izinleri değiştirdikten sonra bu OSX'te başıma geldi.
Thiago Ganzarolli

8
@robsch Genel git config --global ...yapılandırma dosyanızdaki seçeneği ayarlamak için kullanabilirsiniz .
Amber

98

core.filemodeFalse değerine ayarlamak işe yarar, ancak içindeki ayarların, bu ayarların ~/.gitconfiggeçersiz kılmadığından emin olun .git/config.


3
Orada bulundum, bitti. Ne yazık ki yorumunuzu ancak sorunu kendim çözdükten sonra buldum. Yine de +1!
David Schmitt

1
Diğer kullanıcılar bu projeyi Windows'ta klonluyorlarsa, değişikliği sadece ~/.gitconfigdosyaya uygulamak en iyisi olabilir !
Ian Vaughan

Windows Powershell'i kontrol etmek istiyorsanız. git config --list --show-origin | sls filemodeveya Linux'ta git config --list --show-origin | grep filemode. Bu, ayarlamaları nerede yapmanız gerektiğini gösterir.
Frank Fu

Başardın!! Aferin.
Kim

27

Git sorununu eski bir sabit diskteki çalışma dosyalarıyla birkaç kez kopyalarken bu sorunla karşılaştım. Sorun, sahibin ve izinlerin eski sürücüden / makineden yenisine değişmesinden kaynaklanıyor. Uzun ve kısa, şeyleri düzeltmek için aşağıdaki komutları çalıştırın ( bu süper kullanıcı cevabı sayesinde ):

sudo chmod -R -x . # remove the executable bit from all files

Eski komut aslında git diff'in bildirdiği farkları çözer, ancak dizinleri listeleme yeteneğinizi iptal eder, bu nedenle ls ./başarısız olur ls: .: Permission denied. Bunu düzeltmek için:

sudo chmod -R +X . # add the executable bit only for directories

Kötü haber şu ki, çalıştırılabilir tutmak istediğiniz herhangi bir dosyanız varsa, örneğin .shkomut dosyaları, bunları geri almanız gerekir. Bunu her dosya için aşağıdaki komutla yapabilirsiniz:

chmod +x ./build.sh # where build.sh is the file you want to make executable again

2
Teşekkürler, bana çok yardımcı oldu! Ayrıca git config core.filemodeayarlanmış olup olmadığı kontrol edilmelidir true, aksi takdirde izin değişiklikleri algılanmaz. Ben de almak için her değişiklikten sonra git endeksi yenilemek gerekiyordu.
pat-s

Etkilenen bağımlılıklar konusunda endişeleriniz varsa bu çözüm en güvenlisidir.
Jin

9

Genellikle repo Windows ve Linux / Unix makineleri arasında klonlandığında olur.

Git'e filemode değişikliğini yok saymasını söyleyin, işte birkaç yol:

  1. SADECE güncel repo için yapılandır:

    git config core.filemode false
    
  2. Global olarak yapılandır:

    git config --global core.filemode false
    
  3. ~ / .Gitconfig dosyasına ekleyin:

    [core]
         filemode = false
    

Sadece birini seçin.


Küresel yapılandırma çalışmıyor çünkü (sanırım) git bu seçeneklerin true olarak ayarlanmış bir repo oluşturması (Linux'ta bir repo oluşturdum)
Herrgott

4

Dizinin bazı izinlerini değiştirdiğiniz anlaşılıyor. Geri yüklemek için aşağıdaki adımları uyguladım.

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .

3

Repo'yu beklenen varsayılan duruma sıfırlamak için git reset --hard HEAD'i deneyebilirsiniz.


8
Git bir çekme işleminden sonra yürütülebilir biti doğru / tutarlı bir şekilde ayarlayamadıysa, sıfırlamadan sonra daha iyi olmayacaktır.
CB Bailey

2
Bazı projeleri bir usb sürücüsüne (fat32) ve tekrar ubuntu makineme (ext4) taşıdım ve bir dizi değiştirilmiş dosya, öznitelikler ile bitirdim. git reset --hard HEADbenim için mükemmel çalıştı. teşekkürler
cirovladimir

7
-1. OP "sadece yakın zamanda düzenlediğim ve taahhüt etmek istediğim dosyaları seçmek için" yazıyor. Bu, bu düzenlemeleri de kaldıracaktır.
whitfin

9
-1 git'te bu komutu önermek, "rm -rf ./ yapabilirsiniz, istenmeyen sonuçların olmayacağından eminim" demeye benzer.
Kzqai

1
Hayır, bu yardımcı olmuyor ve sorun bu. Sıfırlayıp temizlediniz ve hala git durumu mod değişikliklerini gösteriyor. Bu windows git ile ciddi bir sorundur ve ben sadece dosya modunu göz ardı ederek çalıştı değil, düzeltilmesi gerektiğini düşünüyorum.
vezenkov


1

Bu, çekme ve tüm dosyalar uzak depoda yürütülebilir olduğunda olur. Onları tekrar çalıştırılabilir yapmak her şeyi tekrar normale döndürecektir.

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

Yapmanız gerekebilir:

chmod -x <file> // Removes execute bit

bunun yerine, yürütülebilir olarak ayarlanmayan ve yukarıdaki işlem nedeniyle değiştirilen dosyalar için. Bunu yapmanın daha iyi bir yolu var ama bu sadece çok hızlı ve kirli bir düzeltme.


1

Dosya modunuzu geri değiştirmek için aşağıdaki komutu kullanabilirsiniz. git add --chmod=+x -- filename Sonra şubeye taahhüt edin.


0

Değişen izinleri ile sadece bir zahmetli dosya vardı. Tek tek geri almak için,rm <file> ve sonra yeni bir kopya çekmek için bir ödeme yaptım.

Neyse ki henüz sahnelememiştim.

Eğer olsaydım koşmadan git reset -- <file>önce koşabilirdimgit checkout -- <file>


0

Şube müdürümle dağıtırken bu sorunla karşılaştım. Git, şubemin master ile aynı olmasını beklediğimde bir 'mod' hatası döndürdü. Dosyayı silerek ve ardından master'ı tekrar birleştirerek düzelttim.

İlk fark koştu:

git checkout my-branch
git diff master

Bu geri döndü:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

Daha sonra düzeltmek için aşağıdakileri çalıştırdım:

rm bin/script.sh
git merge -X theirs master

Bundan sonra git diffşubem ve usta arasında hiçbir fark yok.

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.