Soru Git'i dosya modu (chmod) değişikliklerini yok saymayı nasıl başarabilirim?


İle dosya modunu değiştirmek zorunda olduğum bir projem var. chmod gelişirken 777'ye kadar, ancak ana repoda değişmemelidir.

Git alır chmod -R 777 . ve tüm dosyaları değiştirildi olarak işaretler. Git, dosyalarda yapılmış mod değişikliklerini yok saymanın bir yolu var mı?


1891
2017-10-16 21:43


Menşei


Bu, Windows üzerinde Ubuntu üzerinde Windows + Bash üzerinde git ile çalışırken yararlıdır - Elazar
Belirli bir çağrı için izin değişikliklerini göz ardı etmek isteyen herkes için git diffve bu nedenle Git yapılandırma dosyalarını değiştirmek istemez: git diff -G. başına Zed Cevap İşte. - sampablokuper


Cevaplar:


Deneyin:

git config core.fileMode false

itibaren Git-yapılandırma (1):

core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

-c bayrak, bu seçeneği tek seferlik komutlar için ayarlamak için kullanılabilir:

git -c core.fileMode=false diff

Ve --global bayrak, oturum açmış kullanıcı için varsayılan davranış haline getirecektir.

git config --global core.fileMode false

Uyarı

core.fileMode en iyi uygulama değildir ve dikkatli kullanılmalıdır. Bu ayar sadece çalıştırılabilir mod bitini ve asla okuma / yazma bitlerini kapsamaz. Birçok durumda bu ayarlara ihtiyacınız olduğunu düşünüyorsunuz çünkü chmod -R 777tüm dosyalarınızı yürütülebilir hale getirin. Ancak çoğu projede çoğu dosyaya gerek yoktur ve güvenlik nedenleriyle çalıştırılamaz.

Bu tür bir durumu çözmenin uygun yolu, aşağıdaki gibi bir şeyle klasör ve dosya iznini ayrı ayrı ele almaktır:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

Bunu yaparsan asla kullanmaya gerek kalmayacaksın. core.fileModeÇok nadir ortamlarda hariç.


3117
2017-10-16 21:53



Yaparsan git config --global core.filemode false Sadece tüm reposlar için bunu bir kez yapmanız gerekir. - Greg
Bu benim için işe yaramadı ben davaya kadar ben filemode yerine fileMode olmalı - tishma
@tishma: Git yapılandırma bölümü ve değişken isimleri Belgelere göre duyarsız, bkz. KONFİGÜRASYON DOSYASI bölümüYani, eğer yukarıda sizin için işe yaramadıysa, o zaman farklı bir nedenden ötürü. - Greg Hewgill
@donquixote: git config komut, ayarı doğru yapılandırma dosyasına yazar (.git/config sadece mevcut havuz için veya ~/.gitconfig ile kullanılıyorsa --global). - Greg Hewgill
@ zx1986: Önemli değil. itibaren git config: "Değişken adları büyük küçük harf duyarsız ..." - Greg Hewgill


çalışma ağacında mod değiştirilmez:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

Veya mingw-git

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

247
2018-01-18 02:20



OS X Lion'da, -d'\n' bölümünden xargs Bu yasadışı bir argüman olduğu (ve gerekli değil). - Pascal
"Chmod: + x" ifadesinden sonra eksik işlenen ile ilgili hataları göz ardı edebilirsiniz. - Casey Watson
bu güncel mi? Ben mingw'de 'chmod: çok az argüman' alıyorum - hammett
@Pascal @pimlottc The -d, herhangi bir boşluk yerine yeni satır olacak şekilde sınırlayıcıyı belirtir. BSD xargs bu seçeneğe sahip değildir, ancak bunun yerine çıkışı tr '\n' '\0' ve sonra kullanın -0 sınırlayıcı olarak NUL kullanmak için xargs arg. - Mark Aufflick
Havalı tr İşe yaradı! İşte OSX için tam komut: git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x - K.-Michael Aye


Tüm seçenekleriniz için bu seçeneği ayarlamak isterseniz, --global seçeneği.

git config --global core.filemode false

Bu işe yaramazsa muhtemelen daha yeni bir sürümünü kullanıyorsunuzdur. --add seçeneği.

git config --add --global core.filemode false

--Global seçeneği olmadan çalıştırırsanız ve çalışma dizininiz bir repo değilse,

error: could not lock config file .git/config: No such file or directory

115
2018-04-21 12:00



Git sürüm 1.7.9.6'da (Apple Git-31.1) benim için çalışmıyor - Filip Kunc
Daha sonra GIT kullanır gibi görünüyor --add, de olduğu gibi git config --add --global core.filemode false - mgaert
Repo'nun yerel yapılandırması zaten filemode = true ise, global yapılandırma değiştirilemez çünkü yerel yapılandırma genel yapılandırmayı geçersiz kılar. Makinenin her bir repo'sunun yerel yapılandırmasını bir kez değiştirmek zorunda kalacak - Syed Rakib Al Hasan
LÜTFEN: Bu cevabı syedrakib'in uyarısıyla güncelleyin! Her şey onu bulmadan önce çıldırdı ve sonradan mükemmel bir his verdi. - jerclarke


Eğer

git config --global core.filemode false

sizin için çalışmaz, elle yapın:

cd into yourLovelyProject folder

.git klasörüne cd:

cd .git

config dosyasını düzenleyin:

nano config

yanlış olarak doğru değiştirmek

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

kaydet, çık, üst klasöre git:

cd ..

git yeniden

git init

bitirdiniz!


66
2017-08-06 13:10



Düzenlemek yerine .git/config, basit git config core.fileMode false projenizin kökünde yeterlidir. Yapılandırma dosyasını düzenlerseniz, yönergeyi tamamen kaldırmanız daha iyidir, böylece genel olanı alırsınız. - Felix
-1 eğer git config --global çalışmıyorsa, sistem düzeyinde yapmak için izinleriniz yok demektir. global seçeneği el ile düzenleme ile aynı şeyi yapar. - CharlesB
@CharlesB yanlış - cevap, projeye doğrudan seçeneği koyarak projeye özel bir çözüm getirerek bir geçici çözüm sağladı. Bu, gelecekte yapacağınız / teslim ettiğiniz diğer git projeleriyle çalışmaz, ancak üzerinde çalıştığınız proje için çalışır. (hadi biz diyelim ki anlaşamıyoruz ~/.gitconfig, ve ~/project/.git/config) - sircapsalot
Bu bir kez koştu git init filemode'u tekrar doğruya ayarlamalı mıyız? - Jordan


Ekleniyor Greg Hewgill cevap (kullanmanın core.fileMode yapılandırma değişkeni):

Kullanabilirsiniz --chmod=(-|+)x seçeneği git update-index "git commit" (ve "git commit -a" değil) kullanırsanız, dizinden yürütme izinlerini değiştirmek için "git add" (düşük seviyeli "git add") sürümü.


48
2017-10-16 22:03



Bu, ayrı bir cevap olarak eklenmek yerine Greg Hewgill'in cevabıyla düzeltilmiş olmalıydı, böylece tek bir açık sunumla yüce bir cevap yaratıldı. - Greg
@Greg: Kişinin kendi cevabını düzenlemek için yeterli puanı olması gerekir; O zaman izinleri düzenlemek için yeterli değildim sanırım. - Jakub Narębski
@Jakub Artık yeterli saygınlığınız olduğunu düşünüyorum :) Bu komut örnek bir dosya için neye benziyor? - Alex Hall


Global olarak yapılandırabilirsiniz:

git config --global core.filemode false

Yukarıdaki işlem sizin için uygun değilse, yerel yapılandırmanızın nedeni genel yapılandırmayı geçersiz kılar.

Genel yapılandırmanın etkili olması için yerel yapılandırmanızı kaldırın:

git config --unset core.filemode

Alternatif olarak, yerel yapılandırmanızı doğru değere değiştirebilirsiniz:

git config core.filemode false


32
2018-01-21 09:12



Ana cevap size yardımcı olmazsa, bunu deneyin. Yerel yapılandırmanızı değiştirmeden kontrol etmek istiyorsanız, kontrol edin git config -l (mevcut yapılandırmayı listeleme - hem yerel hem de global) - Krzysztof Bociurko


Kullandıysanız chmod komutu daha sonra dosya farkını kontrol edin, Önceki dosya modunu ve şu anki dosya modunu gösterir:

yeni mod: 755

eski mod: 644

Aşağıdaki komutu kullanarak tüm dosyaların eski modunu ayarla

sudo chmod 644 .

şimdi config.fileMode komut dosyasında veya el ile yapılandırma dosyasında false olarak ayarlandı.

git config core.fileMode false

sonra tüm dosyaların izinlerini değiştirmek için chmod komutunu uygulayın.

sudo chmod 755 .

ve tekrar core.fileMode öğesini true olarak ayarlayın.

git config core.fileMode true

En iyi uygulamalar için core.fileMode'u her zaman yanlış tutmayın.


16
2017-10-13 07:34



Bütün bir projenin (geliştirme, evreleme ve üretimde) 755 olması gerektiğini mi söylüyorsunuz? - Daniel
@Daniel Feb: Hayır, yalnızca gerekli dosyaların modunu değiştirir. - Kishor Vitekar
For best practises don't Keep core.fileMode false always Ne demek istiyorsun, bunu açıklamalısın. - bg17aw
For best practises don't Keep core.fileMode false always. Bazı dosya sistemleri (örneğin, FAT) dosya izinlerini desteklemez, böylece işletim sistemi varsayılan bir değeri bildirir (sistemimde zaten 766). Bu durumda, core.filemode Gereksiz ve kasıtsız izin değişiklikleri ile taahhüt geçmişini şişirmek istemediğiniz sürece, yerel yapılandırmada kesinlikle gereklidir - KevinOrr
Ayrıca, neden izinleri değiştiriyorsun? Ayarlarsanız core.filemode=false sonra git yürütme bit değişikliklerini, yerel izinleri değiştirmeye gerek kalmaz. Dizine zaten izin değişiklikleri eklemediyseniz, bu durumda ihtiyacınız olan adımı kaçırırsınız. git add kapattıktan sonra core.filemode. - KevinOrr


Yapılandırma dosyalarında (alt modüller dahil) filemode'u false olarak ayarlamak isterseniz: find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'


14
2017-07-16 12:23



Bu satır yapılandırma dosyasında değilse, bu işe yaramaz. Alt modüller için değiştirmek isterseniz, şunu deneyin: git submodule foreach git config core.fileMode false - courtlandj