Cum pot face ca Git să ignore schimbările de mod de fișier (chmod)? (Programare, Git, Ignora, Chmod)

Marcus Westin a intrebat.

Am un proiect în care trebuie să schimb modul fișierelor cu chmod la 777 în timpul dezvoltării, dar care nu ar trebui să se schimbe în repo-ul principal.

Git preia chmod -R 777 . și marchează toate fișierele ca fiind modificate. Există o modalitate de a face ca Git să ignore modificările de mod care au fost făcute la fișiere?

Comentarii

    28

  • Acest lucru este util atunci când lucrați cu git pe Windows + Bash pe Ubuntu pe Windows –  > Por Elazar.
  • Pentru oricine dorește doar să ignore modificările de permisiune pentru o anumită invocare a lui git diff, , și care, prin urmare, nu dorește să-și modifice fișierele de configurare Git: puteți utiliza git diff -G. conform răspunsului lui Zed de aici. – user82216
11 răspunsuri
Greg Hewgill

Încercați:

git config core.fileMode false

De la git-config(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).

The -c poate fi utilizat pentru a seta această opțiune pentru comenzi unice:

git -c core.fileMode=false diff

Și opțiunea --global flag va face ca acesta să fie comportamentul implicit pentru utilizatorul logat.

git config --global core.fileMode false

Modificările setării globale nu vor fi aplicate la depozitele existente. În plus, git clone și git init setați în mod explicit core.fileMode la true în repo config, așa cum s-a discutat în Git global core.fileMode false overridden locally on clone

Avertisment

core.fileMode nu este cea mai bună practică și trebuie utilizat cu atenție. Această setare acoperă doar partea executabilă a modului și niciodată părțile de citire/scriere. În multe cazuri, credeți că aveți nevoie de această setare pentru că ați făcut ceva de genul chmod -R 777, , făcând ca toate fișierele dvs. să fie executabile. Dar în majoritatea proiectelor majoritatea fișierelor nu au nevoie și nu ar trebui să fie executabile din motive de securitate.

Modalitatea corectă de a rezolva acest tip de situație este de a gestiona separat permisiunile pentru dosare și fișiere, cu ceva de genul:

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

Dacă procedați astfel, nu va fi niciodată nevoie să utilizați core.fileMode, , cu excepția unui mediu foarte rar.

Comentarii

    211

  • Dacă faceți git config --global core.filemode false va trebui să faceți acest lucru doar o singură dată pentru toate depozitele. –  > Por Greg.
  • 15

  • acest lucru nu a funcționat pentru mine până când nu am rezolvat cazul în care ar trebui să fie fileMode în loc de filemode –  > Por tishma.
  • @tishma: Secțiunea de configurare Git și numele variabilelor sunt insensibile la majuscule și minuscule conform documentației, consultați secțiunea FILE DE CONFIGURARE, , așa că dacă cele de mai sus nu au funcționat pentru tine, atunci a fost din alt motiv. –  > Por Greg Hewgill.
  • @donquixote: The git config comandă scrie setarea în fișierul de configurare corect (.git/config doar pentru depozitul curent sau ~/.gitconfig dacă este utilizat cu --global). –  > Por Greg Hewgill.
  • @zx1986: Nu contează. De la git config: „Numele variabilelor sunt insensibile la majuscule și minuscule, …” –  > Por Greg Hewgill.
yoda

schimbarea modului de anulare în arborele de lucru:

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

Sau în mingw-git

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

Comentarii

    42

  • Pe OS X Lion, omiteți -d'
    '
    din xargs deoarece acesta este un argument ilegal (și nu este necesar). –  > Por Pascal.
  • Puteți ignora orice erori despre „chmod: operand lipsă după `+x'” –  > Por Casey Watson.
  • este aceasta actualizată? Primesc „chmod: prea puține argumente” în mingw –  > Por hammett.
  • @Pascal @pimlottc -d specifică faptul că delimitatorul trebuie să fie newline în loc de orice spațiu alb. BSD xargs nu are această opțiune, dar în schimb puteți direcționa ieșirea prin tr '
    ' ''
    și apoi să folosiți opțiunea -0 arg la xargs pentru a folosi NUL ca delimitator. –  > Por Mark Aufflick.
  • Tare, aplicația tr lucru a funcționat! Iată comanda completă pentru OSX: git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '
    ' ''|xargs -0 chmod -x
    –  > Por K.-Michael Aye.
adrien

Dacă doriți să setați această opțiune pentru toate depozitele dumneavoastră, utilizați comanda --global opțiune.

git config --global core.filemode false

Dacă aceasta nu funcționează, probabil că utilizați o versiune mai nouă de git, așa că încercați opțiunea --add opțiune.

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

Dacă îl rulați fără opțiunea –global și directorul de lucru nu este un repo, veți obține

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

Comentarii

  • Se pare că GIT mai târziu folosește --add, , ca în git config --add --global core.filemode false –  > Por mgaert.
  • 15

  • Dacă configurația locală a repo-ului are deja filemode=true, atunci schimbarea configurației globale nu va ajuta, deoarece configurația locală va anula configurația globală. Va trebui să modificați configurația locală a fiecărui repo al mașinii o dată –  > Por Rakib.
  • VĂ RUGĂM: Actualizați acest răspuns cu avertismentul lui Syedrakib! Totul părea o nebunie înainte de a o găsi și a avut un sens perfect după. –  > Por jerclarke.
Sinan Eldem

Dacă

git config --global core.filemode false

nu funcționează pentru tine, fă-o manual:

cd into yourLovelyProject folder

cd în folderul .git:

cd .git

editați fișierul de configurare:

nano config

schimbați true în false

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

salvați, ieșiți, mergeți la dosarul superior:

cd ..

reiniciați fișierul git

git init

ați terminat!

Comentarii

  • În loc să editați .git/config, , o simplă git config core.fileMode false în rădăcina proiectului dumneavoastră este suficient. Dacă editați fișierul de configurare, este mai bine să eliminați directiva în întregime, astfel încât să fie preluată cea globală. –  > Por Felix.
  • -1 dacă git config –global nu funcționează înseamnă că nu aveți permisiunile necesare pentru a o face la nivel de sistem, eliminând global opțiunea face exact același lucru ca și cum ai edita manual .git/config –  > Por CharlesB.
  • @CharlesB incorect – răspunsul a oferit o soluție de rezolvare prin introducerea opțiunii direct în proiect, făcând-o specifică proiectului. Acest lucru nu va funcționa cu alte proiecte git pe care le faceți/verificați în viitor, dar funcționează pentru proiectul la care lucrați. (să ne asigurăm că dezambiguizăm ~/.gitconfig, , și ~/project/.git/config) –  > Por ddavison.
  • După ce acest lucru a fost executat git init ar trebui să setăm filemode înapoi la true? –  > Por Jordan.
  • git init readuce filemode la TRUE! –  > Por Geka P.
Jakub Narębski

Adăugare la răspunsul lui Greg Hewgill (de a folosi core.fileMode variabila de configurare):

Puteți utiliza --chmod=(-|+)x opțiunea de git update-index (versiunea de nivel scăzut a „git add”) pentru a schimba permisiunile de execuție în index, de unde ar fi preluată dacă ați folosi „git commit” (și nu „git commit -a”).

Comentarii

  • Acest lucru ar fi trebuit să fie editat în răspunsul lui Greg Hewgill, mai degrabă decât adăugat ca răspuns separat, creând astfel un singur răspuns suprem cu o singură reprezentare lipsită de ambiguitate. –  > Por Greg.
  • @Greg: Trebuie să ai suficiente puncte pentru a edita nu propriul răspuns; cred că nu aveam suficiente pentru a avea permisiuni de editare la acel moment. –  > Por Jakub Narębski.
  • @Jakub Cred că ai suficientă reputație acum 🙂 Cum ar arăta această comandă pentru un fișier de exemplu? –  > Por Alex Hall.
Tyler Long

O puteți configura la nivel global:

git config --global core.filemode false

Dacă cele de mai sus nu funcționează în cazul tău, motivul ar putea fi faptul că configurația ta locală prevalează asupra celei globale.

Îndepărtați configurația locală pentru a face ca configurația globală să aibă efect:

git config --unset core.filemode

Alternativ, ați putea să vă modificați configurația locală la valoarea corectă:

git config core.filemode false

Comentarii

  • Dacă răspunsul principal nu vă ajută – încercați-l pe acesta. Dacă doriți să verificați configurația locală fără să o modificați, verificați git config -l (lista configurației curente – atât locală cât și globală) – –  > Por Krzysztof Bociurko.
  • Eliminarea configurației locale este motivul pentru care global nu a funcționat pentru mine. Vă mulțumim! –  > Por Greadimar.
Kishor Vitekar

Dacă ați folosit chmod deja, atunci verificați diferența dintre fișiere, aceasta arată modul anterior al fișierului și modul actual al fișierului, cum ar fi:

noul mod : 755

modul vechi : 644

setați modul vechi al tuturor fișierelor folosind comanda de mai jos

sudo chmod 644 .

acum setați core.fileMode la false în fișierul de configurare, fie folosind comanda, fie manual.

git config core.fileMode false

apoi aplicați comanda chmod pentru a schimba permisiunile tuturor fișierelor, cum ar fi

sudo chmod 755 .

și setați din nou core.fileMode la true.

git config core.fileMode true

Pentru cele mai bune practici, nu păstrați întotdeauna core.fileMode false.

Comentarii

  • Vreți să spuneți că un întreg proiect (în dezvoltare, în staging și în producție) ar trebui să fie 755? –  > Por Daniel.
  • @Daniel Februarie: Nu. schimbați modul doar pentru fișierele necesare. –  > Por Kishor Vitekar.
  • For best practises don't Keep core.fileMode false always ce vrei să spui, ar trebui să explici asta. –  > Por bg17aw.
  • For best practises don't Keep core.fileMode false always. Unele sisteme de fișiere (FAT, de exemplu) nu acceptă permisiunile de fișiere, astfel încât sistemul de operare va raporta o valoare implicită (766 pe sistemul meu, oricum). În acest caz, core.filemode este absolut necesară în configurația locală, cu excepția cazului în care doriți să umflați istoricul confirmărilor cu modificări inutile și neintenționate ale permisiunilor –  > Por KevinOrr.
  • De asemenea, de ce te deranjezi să schimbi permisiunile înapoi? Dacă setați core.filemode=false atunci git va ignora modificările de tip execute bit, nu este nevoie să modificați permisiunile locale. Cu excepția cazului în care ați adăugat deja modificările de permisiuni la index, caz în care vă lipsește pasul în care ar trebui să git add după ce ați dezactivat core.filemode. –  > Por KevinOrr.
Ville

Prin definirea următorului alias (în ~/.gitconfig) puteți dezactiva temporar și cu ușurință FileMode pentru fiecare comandă git:

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

Atunci când acest alias este prefixat la comanda git, modificările modului de fișier nu vor apărea cu comenzi care altfel le-ar arăta. De exemplu:

git nfm status

dryobs

Dacă doriți să setați filemode la false în fișierele de configurare în mod recursiv (inclusiv în submodule) :find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'

Comentarii

  • Acest lucru nu va funcționa dacă linia respectivă nu se află în fișierul de configurare. Dacă doriți să o modificați pentru submodule, încercați acest lucru: git submodule foreach git config core.fileMode false –  > Por courtlandj.
Shashwat Gupta

Soluție simplă:

Apăsați acest lucru Comandă simplă în folderul proiectului(nu va elimina modificările originale) …va face doar elimina modificările care au fost făcute în timp ce ați modificat permisiunea pentru dosarul proiectului

comanda este mai jos:

git config core.fileMode false

De ce toate aceste fișiere inutile sunt modificate:pentru că ați schimbat permisiunile dosarului proiectului cu commend.sudo chmod -R 777 ./domeniulProiectului tău

când veți verifica modificările, ce nu ați făcut? ați găsit ca mai jos în timp ce ați folosit git diff nume fișier

old mode 100644
new mode 100755

Martin Volek

Acest lucru funcționează pentru mine:

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

sau invers, în funcție de sistemul dvs. de operare

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

Comentarii

  • Acest lucru ar schimba permisiunile fișierului, dar nu ar face ca git să ignore permisiunile fișierului. –  > Por domdambrogia.
  • Ei bine, aveți dreptate, asta nu rezolvă chestia cu git ignore. –  > Por Martin Volek.