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?
Î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.
- 211
- Dacă faceți
git config --global core.filemode false
va trebui să faceți acest lucru doar o singură dată pentru toate depozitele. – > . - 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 – > .
- @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. – > .
- @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
). – > . - @zx1986: Nu contează. De la git config: „Numele variabilelor sunt insensibile la majuscule și minuscule, …” – > .
15
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
- 42
- Pe OS X Lion, omiteți
-d'
din
'xargs
deoarece acesta este un argument ilegal (și nu este necesar). – > . - Puteți ignora orice erori despre „chmod: operand lipsă după `+x'” – > .
- este aceasta actualizată? Primesc „chmod: prea puține argumente” în mingw – > .
- @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. – > . - 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
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
- Se pare că GIT mai târziu folosește
--add
, , ca îngit config --add --global core.filemode false
– > . - 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ă – > .
- 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ă. – > .
15
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!
- Î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ă. – > . - -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 – > . - @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
) – > . - După ce acest lucru a fost executat
git init
ar trebui să setăm filemode înapoi la true? – > . git init
readuce filemode la TRUE! – > .
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”).
- 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. – > .
- @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. – > .
- @Jakub Cred că ai suficientă reputație acum 🙂 Cum ar arăta această comandă pentru un fișier de exemplu? – > .
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
- 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ă) – – > . - Eliminarea configurației locale este motivul pentru care global nu a funcționat pentru mine. Vă mulțumim! – > .
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.
- Vreți să spuneți că un întreg proiect (în dezvoltare, în staging și în producție) ar trebui să fie 755? – > .
- @Daniel Februarie: Nu. schimbați modul doar pentru fișierele necesare. – > .
For best practises don't Keep core.fileMode false always
ce vrei să spui, ar trebui să explici asta. – > .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 – > .- 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 dezactivatcore.filemode
. – > .
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
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/'
- 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
– > .
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
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 {} ;
- Acest lucru ar schimba permisiunile fișierului, dar nu ar face ca git să ignore permisiunile fișierului. – > .
- Ei bine, aveți dreptate, asta nu rezolvă chestia cu git ignore. – > .
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 utilizagit diff -G.
conform răspunsului lui Zed de aici. – user82216