Come rimuovo i file che dicono "old mode 100755 new mode 100644" da modifiche non messe in scena in Git?


723

Per qualche ragione, quando inizialmente ho fatto un pull dal repository per un mio progetto git, ho avuto un sacco di file nella mia copia di lavoro che non hanno apportato modifiche riconoscibili a loro, ma continuano a comparire nella mia unstaged changesarea.

Sto usando Git Gui su Windows XP e quando vado a guardare il file per vedere cosa è cambiato. Tutto quello che vedo è:

old mode 100755  
new mode 100644  

Qualcuno sa cosa significa?

Come posso ottenere questi file dal mio elenco di modifiche non messe in scena? (Molto fastidioso dover passare attraverso centinaia di file, solo per selezionare i file che ho modificato di recente e che voglio impegnare).

Risposte:


1286

Mi sembra che le modalità di autorizzazione dei file unix ( 755= rwxr-xr-x, 644= rw-r--r--) - la vecchia modalità includesse il flag + x (eseguibile), la nuova modalità no.

Le risposte di questo problema msysgit suggeriscono di impostare core.filemode su false per eliminare il problema:

git config core.filemode false

132
+1. Ciò significa che git pensa di poter impostare correttamente il bit eseguibile sui file estratti, ma quando tenta di farlo non funziona (o almeno non in modo che possa leggere). Quando poi rilegge lo stato di quei file sembra che il bit eseguibile sia stato deliberatamente disinserito. L'impostazione di core.filemode su false indica a git di ignorare qualsiasi modifica dei bit eseguibile sul filesystem in modo da non vederlo come una modifica. Se hai bisogno di mettere in scena una modifica del bit eseguibile, significa che devi farlo manualmente git update-index --chmod=(+|-)x <path>.
CB Bailey,

7
Se, come me, le modifiche alla modalità sono importanti, è possibile impostare core.filemode su false, confermare le modifiche effettive al codice e quindi impostare core.filemode su true e git conserverà le modifiche al file.
Michael T. Smith,

8
Ho lo stesso problema, ma era dovuto all'uso della stessa git repro tramite SSH git cmd line e tramite Git Extensions su un'unità mappata in Windows! . . La soluzione era la stessa, aggiunta in "config" [core] filemode = false
Ian Vaughan

2
È stato un salvavita, grazie signore! Questo è successo a me su OSX, dopo aver condiviso un repository clonato nella cartella pubblica e modificato le autorizzazioni per i file.
Thiago Ganzarolli,

8
@robsch È possibile utilizzare git config --global ...per impostare l'opzione nel file di configurazione globale.
Ambra

98

L'impostazione core.filemodesu false funziona, ma assicurati che le impostazioni in ~/.gitconfignon vengano sovrascritte da quelle in .git/config.


3
Ci sono stato, l'ho fatto. Purtroppo ho trovato il tuo commento solo dopo aver risolto il problema da solo. Ancora, +1!
David Schmitt,

1
Se altri utenti stanno clonando questo progetto su Windows, potrebbe essere meglio applicare la modifica al ~/.gitconfigfile!
Ian Vaughan,

Se vuoi controllare su Windows Powershell. git config --list --show-origin | sls filemodeo su Linux git config --list --show-origin | grep filemode. Questo ti mostrerà dove è necessario apportare le modifiche.
Frank Fu,

L'hai inchiodato !! Molto bene.
Kim,

27

Ho riscontrato questo problema durante la copia di un repository git con file di lavoro da un vecchio disco rigido un paio di volte. Il problema deriva dal fatto che il proprietario e le autorizzazioni sono cambiate dalla vecchia unità / macchina a quella nuova. Il più lungo e breve è, esegui i seguenti comandi per chiarire le cose ( grazie a questa risposta da superutente ):

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

Il primo comando risolverà effettivamente le differenze riportate da git diff, ma revocherà la possibilità di elencare le directory, quindi ls ./fallisce ls: .: Permission denied. Per risolvere il problema:

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

La cattiva notizia è che se si dispone di file che si desidera mantenere eseguibili, come gli .shscript, è necessario ripristinarli. Puoi farlo con il seguente comando per ogni file:

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

2
Grazie, mi ha aiutato molto! Si dovrebbe anche verificare che git config core.filemodesia impostato su true, altrimenti le modifiche alle autorizzazioni non verranno rilevate. Ho anche bisogno di aggiornare l'indice git dopo ogni modifica per raccoglierlo.
pat-s

Questa soluzione è la più sicura se sei preoccupato per le dipendenze interessate.
Jin

9

Di solito si verifica quando il repository viene clonato tra macchine Windows e Linux / Unix.

Basta dire a git di ignorare la modifica della modalità file, qui ci sono diversi modi:

  1. Configurazione SOLO per repository corrente:

    git config core.filemode false
    
  2. Config a livello globale:

    git config --global core.filemode false
    
  3. Aggiungi in ~ / .gitconfig:

    [core]
         filemode = false
    

Basta selezionarne uno.


La configurazione globale non funziona perché (immagino) git crea un repository con questa opzione impostata su true (ho creato un repository in linux)
Herrgott

4

Sembra che tu abbia modificato alcune autorizzazioni della directory. Ho fatto i seguenti passi per ripristinarlo.

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

$  git checkout .

3

Puoi provare git reset --hard HEAD per ripristinare il repository allo stato predefinito previsto.


8
Se git non è stato in grado di impostare il bit eseguibile correttamente / coerentemente dopo un pull, non sarà più corretto dopo un reset.
CB Bailey,

2
Ho spostato alcuni progetti su un'unità USB (fat32) e di nuovo sulla mia macchina Ubuntu (ext4) e ho finito con un mucchio di file modificati, beh, gli attributi. git reset --hard HEADha funzionato perfettamente per me. grazie
cirovladimir,

7
-1. Gli stati OP "solo per selezionare i file che ho modificato di recente e voglio impegnare". Ciò eliminerebbe anche quelle modifiche.
whitfin,

9
-1 Suggerire questo comando in git è simile a dire "puoi solo rm -rf ./, sono sicuro che non avrà conseguenze indesiderate".
Kzqai,

1
No, questo non aiuta e questo è il problema. Hai ripristinato e pulito e ancora lo stato git sta mostrando i cambiamenti di modalità. Questo è un problema serio con Windows Git e penso che dovrebbe essere risolto, non solo aggirato ignorando la modalità file.
Vezenkov,


1

Ciò accade quando si estrae e tutti i file erano eseguibili nel repository remoto. Rendendoli di nuovo eseguibili, tutto tornerà alla normalità.

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

Potrebbe essere necessario fare:

chmod -x <file> // Removes execute bit

invece, per i file che non sono stati impostati come eseguibili e che sono stati modificati a causa dell'operazione precedente. C'è un modo migliore per farlo, ma questa è solo una soluzione molto veloce e sporca.


1

È possibile utilizzare il comando seguente per ripristinare la modalità file. git add --chmod=+x -- filename Quindi impegnarsi nella filiale.


0

Ho avuto solo un file problematico con le autorizzazioni modificate. Per ripristinarlo singolarmente, l'ho semplicemente eliminato manualmente conrm <file> e poi ho fatto un checkout per estrarre una nuova copia.

Fortunatamente non l'avevo ancora messo in scena.

Se avessi potuto correre git reset -- <file>prima di correregit checkout -- <file>


0

Mi sono appena imbattuto in questo problema quando ho cambiato il mio ramo con il master. Git ha restituito un errore 'mode' quando mi aspettavo che il mio ramo fosse identico al master. Ho risolto eliminando il file e quindi unendo nuovamente il master.

Prima ho eseguito il diff:

git checkout my-branch
git diff master

Questo ha restituito:

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

Ho quindi eseguito il seguente per risolvere:

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

Dopo questo, git diffnon ha restituito differenze tra my-branch e master.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.