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


2309

chmodGeliştirirken dosya modunu 777'ye değiştirmek zorunda kaldığım , ancak ana repoda değişmemesi gereken bir projem var .

Git alır chmod -R 777 .ve tüm dosyaları değiştirilmiş olarak işaretler. Git'in dosyalarda yapılan mod değişikliklerini yoksaymasının bir yolu var mı?


17
Windows üzerinde Ubuntu üzerinde Windows + Bash üzerinde çalışırken
Elazar

4
Sadece izin belirli bir çağrı için değişiklikleri görmezden isteyen herkes için git diff, ve kim bu nedenle Git yapılandırma dosyaları değiştirmek istemiyor: kullanabileceğiniz git diff -G.başına Zed cevap burada .
sampablokuper

Yanıtlar:


3821

Deneyin:

git config core.fileMode false

Kaynaktan git-yapılandırma (1) :

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

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

git -c core.fileMode=false diff

Ve --globalbayrak oturum açan kullanıcı için varsayılan davranışı yapacaktır.

git config --global core.fileMode false

Genel ayardaki değişiklikler mevcut depolara uygulanmaz. Ayrıca, git cloneve git initaçık bir şekilde ayarlanabilir core.fileModeiçin truede tartışıldığı gibi repo config klon üzerinde geçersiz kılınan yerel Git küresel core.fileMode YANLıŞ

Uyarı

core.fileModeen iyi uygulama değildir ve dikkatli kullanılmalıdır. Bu ayar yalnızca çalıştırılabilir mod bitini kapsar ve asla okuma / yazma bitlerini kapsamaz. Çoğu durumda chmod -R 777, tüm dosyalarınızı yürütülebilir hale getirmek gibi bir şey yaptığınız için bu ayara ihtiyacınız olduğunu düşünüyorsunuz . Ancak çoğu projede çoğu dosyanın güvenlik nedeniyle çalıştırılması gerekmez ve çalıştırılmamalıdır .

Bu tür bir durumu çözmenin uygun yolu, klasör ve dosya iznini ayrı bir şekilde 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ız core.fileMode, çok nadir ortamlar dışında asla kullanmanız gerekmez .


203
Bunu yaparsanız git config --global core.filemode false, tüm depolar için bunu yalnızca bir kez yapmanız gerekir.
Greg

13
Bu, filemode yerine fileMode yerine
davayı düzeltene

8
@tishma: Git yapılandırma bölümü ve değişken adları belgelere göre büyük / küçük harfe duyarsızdır, KONFİGÜRASYON DOSYASI bölümüne bakın , bu nedenle yukarıdakiler sizin için işe yaramadıysa, farklı bir nedenden ötürü idi.
Greg Hewgill

11
@ donquixote: git configKomut, ayarı doğru yapılandırma dosyasına yazar ( .git/configyalnızca geçerli depo için veya ~/.gitconfigile kullanılıyorsa --global).
Greg Hewgill

8
@ zx1986: Önemli değil. Gönderen git yapılandırma : "değişken isimleri harf duyarsız ..."
Greg Hewgill

277

çalışma ağacında geri alma modu değişikliği:

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'te

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

42
OS X Lion'da, bu yasa dışı bir argüman olduğu için -d'\n'parçayı atlayın xargs(ve gerekli değildir).
Pascal

9
"Chmod:` `x x '' den sonra eksik işlenen" ile ilgili hataları görmezden gelebilirsiniz
Casey Watson

5
bu güncel mi? Mingw'de 'chmod: çok az argüman' alıyorum
hammett

7
@Pascal @pimlottc -d, sınırlayıcının herhangi bir boşluk yerine satırsonu olduğunu belirtir. BSD xargs bu seçeneğe sahip değildir, ancak bunun yerine çıktıyı birbirine bağlayabilir tr '\n' '\0've daha sonra -0argümanı xulgs için ayırıcı olarak NUL kullanmak için kullanabilirsiniz.
Mark Aufflick

10
Harika, triş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

135

Bu seçeneği tüm depolarınız için ayarlamak istiyorsanız, --globalseçeneği kullanın.

git config --global core.filemode false

Bu işe yaramazsa, muhtemelen git'in daha yeni bir sürümünü kullanıyorsunuz, bu yüzden --addseçeneği deneyin .

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

5
Görünüşe göre daha sonra GIT kullanır --add, olduğu gibigit config --add --global core.filemode false
mgaert

14
Repo'nun yerel yapılandırması zaten filemode = true değerine sahipse, yerel yapılandırma genel yapılandırmayı geçersiz kılacağı için genel yapılandırmayı değiştirmek yardımcı olmaz. Makinenin her
deposunun

3
LÜTFEN: Bu cevabı syedrakib'in uyarısıyla güncelleyin! Onu bulmadan önce her şey delirmiş ve sonra mükemmel bir anlam ifade etmişti.
jerclarke

88

Eğer

git config --global core.filemode false

sizin için çalışmazsa manuel olarak yapın:

cd into yourLovelyProject folder

cd .git klasörüne:

cd .git

yapılandırma dosyasını düzenleyin:

nano config

true değerini false olarak değiştir

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

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

cd ..

git'i yeniden başlat

git init

bitirdiniz!


11
Düzenlemek yerine, projenizin kökünde .git/configbasit bir git config core.fileMode falseşey yeterlidir. Yapılandırma dosyasını düzenlerseniz, genel olanı almak için yönergeyi tamamen kaldırmanız daha iyi olur.
Felix

6
-1 git config --global çalışmazsa, sistem düzeyinde bunu yapma izniniz olmadığı anlamına gelir; kaldırma globalseçeneği, el ile düzenlemeyle tamamen aynı şeyi yapar .git / config
CharlesB

@CharlesB yanlış - yanıt, seçeneği doğrudan projeye koyarak, projeye özgü hale getirerek bir çözüm sağladı. Bu, gelecekte yapacağınız / ödeme yapacağınız diğer git projeleriyle çalışmaz, ancak üzerinde çalıştığınız proje için işe yarar. ( ~/.gitconfig~/project/.git/config
haksızlaştırdığımızdan

Bu çalıştıktan sonra git initfilemode'u true olarak ayarlamalı mıyız?
Ürdün

53

Greg Hewgill yanıtına ekleme ( core.fileModeconfig değişkeni kullanılarak):

Sen kullanabilirsiniz --chmod=(-|+)xseçeneği git güncelleme-endeks -a taahhüt git" siz "taahhüt Git" kullanırsak alınmayı yerden endekste yürütme izinleri değiştirmek için ( "git add" düşük seviyeli versiyon) (ve ").


2
Bu, ayrı bir cevap olarak eklemek yerine Greg Hewgill'in cevabı olarak düzenlenmeli ve böylece tek bir kesin temsil ile en yüksek bir cevap yaratılmalıdır.
Greg

6
@Greg: Kişinin kendi cevabını değil düzenlemek için yeterli puanı olması gerekir; Sanırım o zaman izinleri düzenlemek için yeterli değere sahip değildim.
Jakub Narębski

1
@Jakub Sanırım şu anda yeterince itibara sahipsin :) Bu komut bir örnek dosya için nasıl görünürdü?
Alex Hall

38

Global olarak yapılandırabilirsiniz:

git config --global core.filemode false

Yukarıdakiler sizin için işe yaramazsa, bunun nedeni yerel yapılandırmanızın genel yapılandırmayı geçersiz kılması olabilir.

Genel yapılandırmanın geçerli 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


4
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(geçerli yapılandırmayı listele - hem yerel hem de küresel)
Krzysztof Bociurko

23

Eğer zaten chmod komutunu kullandıysanız , 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 ayarlama

sudo chmod 644 .

Şimdi komut dosyasını kullanarak veya el ile core.fileMode öğesini false olarak ayarlayın.

git config core.fileMode false

daha sonra aşağıdaki gibi tüm dosyaların izinlerini değiştirmek için chmod komutunu uygulayın

sudo chmod 755 .

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

git config core.fileMode true

En iyi uygulamalar için core.fileMode öğesini her zaman yanlış tutmayın.


Tüm bir projenin (geliştirme, aşamalandırma ve üretimde) 755 olması gerektiğini mi söylüyorsunuz?
Daniel

@Daniel Şub: Hayır. Yalnızca gerekli dosyaların modunu değiştirir.
Kishor Vitekar

For best practises don't Keep core.fileMode false alwaysNe 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 desteklemediğinden, işletim sistemi varsayılan bir değer bildirir (yine de sistemimde 766). Bu durumda, core.filemodegereksiz ve kasıtsız izin değişiklikleri ile taahhüt geçmişini
şişirmek

Ayrıca, neden izinleri değiştirmeyi zahmet ediyorsunuz? Ayarladıysanız core.filemode=falsegit, yürütme bit değişikliklerini yoksayar, yerel izinleri değiştirmenize gerek yoktur. Dizine önceden izin değişiklikleri eklemediyseniz, bu durumda git addkapattıktan sonra yapmanız gereken adımı kaçırırsınız core.filemode.
KevinOrr

18

Aşağıdaki diğer adı (~ / .gitconfig içinde) tanımlayarak fileMode per git komutunu kolayca geçici olarak devre dışı bırakabilirsiniz:

[alias]
nfm = "!f(){ git -c core.fileMode=false $@; };f"

Bu takma ad git komutunun önüne geldiğinde, dosya modu değişiklikleri aksi takdirde bunları gösterecek komutlarla görünmez. Örneğin:

git nfm status

14

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


4
Bu satır config dosyasında değilse bu çalışmaz. git submodule foreach git config core.fileMode false
Alt

4

Basit çözüm:

Bu Hit Basit komutu (proje Klasörde bu orijinal değişiklikleri kaldırmak olmaz) sadece edecek ... değişiklikleri kaldırmak olmuştu yapılır değiştin ise proje klasörü izni

komut aşağıdadır:

git config core.fileMode yanlış

Bu gereksiz dosya neden değiştiriliyor: çünkü proje klasörü izinlerini övgü sudo chmod -R 777 ./yourProjectFolder ile değiştirdiğiniz için

değişiklikleri ne zaman kontrol edeceksin? git diff dosya adını kullanırken aşağıdaki gibi buldunuz

old mode 100644
new mode 100755

1

Bu benim için çalışıyor:

find . -type f -exec chmod a-x {} \;

veya işletim sisteminize bağlı olarak ters

find . -type f -exec chmod a+x {} \;

1
Bu, dosyanın izinlerini değiştirir, ancak git, dosyanın dosya izinlerini yoksaymaz.
domdambrogia

Peki, haklısın, o gitmez görmezden gelmez.
Martin Volek
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.