File visualizzati come modificati direttamente dopo un clone di Git


228

Al momento sto riscontrando un problema con un repository e, sebbene il mio Git-fu sia in genere buono, non riesco a risolvere questo problema.

Quando clonare questo repository, quindi cdnel repository, git statusmostra diversi file modificati. Nota: non ho aperto il repository in nessun editor o altro.

Ho provato a seguire questa guida: http://help.github.com/dealing-with-lineendings/ , ma questo non ha aiutato affatto con il mio problema.

Ci ho provato git checkout -- .molte volte, ma sembra non fare nulla.

Sono su un Mac e non ci sono sottomoduli nel repository stesso.

Il filesystem è un filesystem "Journaled HFS +" su Mac e non fa distinzione tra maiuscole e minuscole. I file sono a una riga e circa 79 KB ciascuno (sì, hai sentito bene), quindi guardare git diffnon è particolarmente utile. Ho sentito parlare di faregit config --global core.trustctime false che potrebbe aiutare, che proverò quando torno al computer con l'archivio su di esso.

Ho cambiato i dettagli del filesystem con i fatti! E ho provato il git config --global core.trustctime falsetrucco che non ha funzionato molto bene.

Risposte:


142

Ho avuto lo stesso problema sul Mac dopo aver clonato un repository. Supporrebbe che tutti i file siano stati modificati.

Dopo l'esecuzione git config --global core.autocrlf input, stava ancora contrassegnando tutti i file come modificati. Dopo aver cercato una soluzione mi sono imbattuto .gitattributesnel file nella directory home che aveva il seguente.

* text=auto

L'ho commentato e tutti gli altri repository clonati da ora in poi funzionavano bene.


5
Grazie! Alla fine l'ho trovato dopo aver passato tutta la serata alternando core.autocrlf e apply.whitespace. Questo ha funzionato. Grazie.
xer0x,

5
La linea offensiva in .gitattributes proviene dai dotfile di Mathias Bynen , nel caso in cui qualcuno lo trovi.
SeanPONeil

31
qualcuno può far luce su questa particolare configurazione? Cosa fa * text=auto? Cosa significa rimuoverlo da .gitattributes? Vedo che risolve questo problema per me, ma non sono sicuro del perché, cosa sta realmente facendo e quali possibili problemi sta probabilmente creando?
Dennis,

6
@Dennis Questa impostazione aiuta a normalizzare le terminazioni di linea, quindi eliminarla non è probabilmente la risposta giusta. Vedi la risposta a questa domanda e questo articolo . La risposta di @Arrowmaster di seguito è stata più utile per me. Ho usato git adde git commitche ha normalizzato il file e mi sono sbarazzato del problema.
jtpereyda,

4
git config --global core.autocrlf inputriparato per me. Grazie.
dimiguel,

89

Capito. Tutti gli altri sviluppatori sono su Ubuntu (penso) e quindi hanno file system sensibili al maiuscolo / minuscolo. Io, tuttavia, non lo faccio (visto che sono su un Mac). In effetti, tutti i file avevano gemelli minuscoli quando li ho guardati usando git ls-tree HEAD <path>.

Ne prenderò uno per risolverlo.


Lo hanno mai risolto? Probabilmente sto riscontrando lo stesso problema.
Josh Johnson,

8
Sì, basta convincere qualcuno con un file system con distinzione tra maiuscole e minuscole a eliminare tutti tranne uno da ogni set di file che avrebbe nomi di file duplicati su un filesystem senza distinzione tra maiuscole e minuscole.
Sam Elliott,

1
Ho appena incontrato lo stesso problema da quando si è passati da Ubuntu a Mac. Grazie, la tua risposta ha colpito l'unghia sulla testa. Spero che l'upgrade lo spinga alla prima posizione. :-)
chmac,

1
@Dirk questo è il motivo per cui ci sono più risposte. Ho accettato quello applicato nel mio caso, il che non è irragionevole.
Sam Elliott,

1
Anche questo era il mio problema: MacOS insensibile alle maiuscole / minuscole. Tuttavia ha git ls-tree HEAD <path>mostrato solo un singolo file. Sono stato in grado di vedere i file duplicati nell'interfaccia utente di GitHub.com, tuttavia, e anche di utilizzare quell'interfaccia utente per eliminare una versione.
Orion Elenzil,

74
git config core.fileMode false

risolto questo problema nel mio caso

https://git-scm.com/docs/git-config

TL; DR;

core.fileMode

Se false, le differenze di bit eseguibili tra l'indice e l'albero di lavoro vengono ignorate; utile su filesystem rotti come FAT. Vedi git-update-index (1).

Il valore predefinito è true, tranne git-clone (1) o git-init (1) esaminerà e imposterà core.fileMode su false se appropriato quando viene creato il repository.


2
Ma cosa fa questo ??
Siwel,

1
Vorrei anche sapere cosa fa, perché ha funzionato anche per me.
Donato,

2
Quando l'ho fatto git diff, ho scoperto che le modifiche erano solo in modalità file. git riprende chmod -R 777 .che è stato causato quando mi sono imbattuto il mio progetto e questo mi ha permesso di configurazione per ignorare le modifiche chmod di git stackoverflow.com/q/1580596/6207775
Ayushya

1
Il collegamento è interrotto ( "Siamo spiacenti, non è possibile trovare i tuoi kernel" ).
Peter Mortensen,

Il resto delle risposte non ha funzionato, ma questo ha fatto la magia!
Incontra Patel

53

Presumo che tu stia usando Windows. La pagina GitHub a cui ti sei collegato ha i dettagli all'indietro. Il problema è che le terminazioni di riga CR + LF sono già state impegnate nel repository e poiché core.autocrlf è impostato su true o input , Git vuole convertire le terminazioni di riga in LF, quindigit status mostra che ogni file viene modificato.

Se si tratta di un repository a cui si desidera solo accedere, ma non si ha alcun coinvolgimento, è possibile eseguire il comando seguente per nascondere semplicemente il problema senza risolverlo effettivamente.

git config core.autocrlf false

Se si tratta di un repository a cui sarai attivamente coinvolto e a cui puoi impegnare le modifiche. Potresti voler risolvere il problema eseguendo un commit che modifica tutte le terminazioni di riga nel repository per utilizzare LF anziché CR + LF e quindi adottare misure per impedire che si verifichi nuovamente in futuro.

Quanto segue è preso direttamente dalla pagina man di gitattributes e dovrebbe essere preformato da una directory di lavoro pulita.

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory.
git status        # Show files that will be normalized.
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

Se vengono visualizzati dei file che non devono essere normalizzati git status, disattiva il loro attributo di testo prima di eseguirlo git add -u.

manual.pdf      -text

Al contrario, i file di testo che Git non rileva possono abilitare la normalizzazione manualmente.

weirdchars.txt  text

8
Non sto usando Windows.
Sam Elliott,

1
Per impostazione predefinita su sistemi non Windows, core.autocrlf è impostato su false. Quindi non dovresti nemmeno aver riscontrato questo problema se è causato dalla fine della linea. Potresti fornire maggiori dettagli sulla tua configurazione specifica come ciò che git diffmostra per quei file che git statusdice che sono stati modificati, e anche quale filesystem stai usando?
Arrowmaster,

ha aggiornato la domanda con le risposte a queste domande. Dare un'altra occhiata a tutti i dettagli in un secondo o due. Non sono sicuro di cosa stiano usando gli altri membri del team di sviluppo
Sam Elliott,

Questo è ciò che ha funzionato per noi ( git config core.autocrlf falseera sufficiente). Siamo rimasti stupiti dal fatto che il client è in esecuzione su Linux (SL / RHEL), ma la sessione Linux è avviata tramite x2go da un host Windows. Quindi questa potrebbe essere la soluzione più probabile in un contesto omogeneo Win + Lin.
Dirk,

37

Si prega di eseguire i seguenti comandi. Questo potrebbe risolvere il problema.

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Nessuna delle altre soluzioni ha funzionato per me, ma questa mi ha rimesso in funzione.
Rainabba,

1
Ho provato questo e ha funzionato per me. Grazie signor LIama!
Danniel Little

Questo peggiora il mio repository. Su un ramo che non aveva subito modifiche, ne avevo 277 dopo averlo eseguito. Ho avuto gli stessi cambiamenti anche su altri rami in cui sono passato. Esegui con cautela. Mi sono appena ritirato dal repository e ho modificato 615 file. :(
Programmatore Paul,

questo ha funzionato per me usando git v2.7.4 con ubuntu (WSL), Git per Windows v2.18.0.windows.1 e posh-git Ho sempre avuto autocrlf falso e il problema è iniziato in Git per Windows e posh-git dopo l'aggiornamento a 2.18.0 oggi
Jim Frenette,

Sono stupito che funzioni. Grazie per l'aiuto. Per altri che seguono questo percorso, i file apparentemente modificati erano tutti i file .png e .bmp gestiti da git LFS
David Casper

16

In Visual Studio, se si utilizza Git, è possibile generare automaticamente i file .gitignore e .gitattributes. Il file .getattributes generato automaticamente ha la seguente riga:

* text=auto

Questa riga si trova nella parte superiore del file. Dovevamo solo commentare la linea aggiungendo un # all'inizio. Dopo averlo fatto, le cose hanno funzionato come previsto.


1
Grazie, ho lottato con questo per aaaages
Andrew Berry,

Questo era esattamente il mio problema. Un altro sviluppatore aveva utilizzato GIT tramite VS anziché CLI e creato questo file .gitattributes.
Josh Maag,

12

Il problema potrebbe anche derivare da autorizzazioni di file diverse , come nel mio caso:

Nuovo repository clonato (Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Archivio remoto nudo (Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

5

Volevo aggiungere una risposta più diretta su "Perché" questo accade, perché esiste già una buona risposta su come risolverlo.

Quindi, .gitattributesha * text=autoun'impostazione, che causa questo problema.

Nel mio caso, i file sul ramo master di GitHub avevano \r\nterminazioni. Ho composto le impostazioni sul repository per effettuare il check-in con \nfinali. Non so cosa Git controlla però. Dovrebbe verificare con finali nativi sul mio box Linux ( \n), ma immagino che abbia verificato il file con \r\nfinali. Git si lamenta perché vede i \r\nfinali estratti nel repository e mi avverte che controllerà le \nimpostazioni. Quindi i file devono "essere modificati".

Questa è la mia comprensione per ora.


3

Ho avuto lo stesso problema. Anche con un Mac. Guardando il repository su una macchina Linux ho notato che avevo due file:

geoip.dat e GeoIP.dat

Ho rimosso quello deprecato sulla macchina Linux e clonato nuovamente il repository sul Mac. Non sono stato in grado di estrarre, eseguire il commit, archiviare o estrarre dalla mia copia del repository in presenza di duplicati.


3

Lo stesso problema per me. Ho potuto vedere diverse immagini con lo stesso nome, come "textField.png" e "textfield.png" nel repository Git remoto, ma non sul mio repository locale. Sono stato in grado di vedere solo "textField.png" che non è stato utilizzato nel codice del progetto.

Si scopre che la maggior parte dei miei colleghi sono su Ubuntu usando il filesystem ext4 mentre io sono su un Mac con APFS.

Grazie alla risposta di Sam Elliott , la soluzione era abbastanza semplice. Innanzitutto ho chiesto a un collega su Ubuntu di eliminare le versioni di file ridondanti con le maiuscole, quindi eseguire il commit e il push sul telecomando.

Quindi ho eseguito il seguente:

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Alla fine, abbiamo deciso che ogni sviluppatore dovrebbe cambiare la sua configurazione Git per evitare che ciò accada mai più:

# Local Git configuration
git config core.ignorecase = true

o

# Global Git configuration
git config --global core.ignorecase = true

Sarebbe meglio se solo upvotedla risposta di @ kds !
Elharony,

Sembra che il comando da riga di comando non dovrebbe avere il segno di uguale ( =) perché finirà ignorecase = =nel file di configurazione.
Dmytro,

1

Ho anche avuto lo stesso problema. Nel mio caso ho clonato il repository e alcuni file mancavano immediatamente.

Ciò è stato causato dal percorso del file e dal nome file troppo lungo per Windows. Per risolverlo, clonare il repository il più vicino possibile alla radice dell'unità disco fisso per ridurre la lunghezza del percorso del file. Ad esempio, clonalo C:\A\GitRepoinvece di C:\Users Documents\yyy\Desktop\GitRepo.


1

Modifica il file chiamato .git/config:

sudo gedit .git/config

O:

sudo vim .git/config

Contenuti

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = kharadepramod@bitbucket.org:DigitalPlumbing/unicorn-magento.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]
    remote = origin
    merge = refs/heads/master

[branch "productapproval"]
    remote = origin
    merge = refs/heads/productapproval

Cambia filemode=truein filemode = false.


Ciò equivale agit config core.Filemode false
Guillermo Prandi l'

1

Per le nuove versioni di macOS ciò può essere causato da una funzione di sicurezza del sistema operativo.

Nel repository su cui stavo lavorando, c'era un file binario che aveva * .app come tipo di file.

Erano solo alcuni dati serializzati, ma macOS tratta tutti i file * .app come un'applicazione e poiché questo file non è stato scaricato dall'utente, il sistema lo ha ritenuto non sicuro e ha aggiunto l' com.apple.quarantineattributo del file che assicura che il file non possa essere eseguito.

Ma l'impostazione di questo attributo sul file stava anche cambiando il file e quindi appariva nel set di modifiche Git senza alcun modo per ripristinarlo.

Puoi verificare se hai lo stesso problema eseguendo $ xattr file.app.

La soluzione è piuttosto semplice, purché non sia necessario lavorare con il file. Aggiungi *.app binaryal tuo .gitattributes.


0

Ho copiato il mio repository locale in un'altra cartella e un gruppo di file modificati è apparso. La mia soluzione era: ho nascosto i file modificati ed eliminato lo stash . Il repository è diventato pulito.


0

Ho scoperto che Git trattava i miei file (.psd in questo caso) come testo. L'impostazione su un tipo binario in .gitattributes lo ha risolto.

*.psd binary

0

Stavo provando a fare un rebase interattivo, ma affermava che c'erano alcuni file modificati, quindi non mi avrebbe permesso di farlo adesso. Ho provato di tutto per tornare in un repository pulito, ma niente ha funzionato. Nessuna delle altre risposte ha aiutato. Ma alla fine ha funzionato ...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

Boom! Repository pulito. Problema risolto. Poi ho dovuto abbandonare l'ultimo commit quando ho fatto il mio rebase -ie alla fine tutto è tornato pulito. Bizzarro!


0

Nel caso in cui aiuti qualcun altro, potrebbe esserci un'altra causa per questo problema: diverse versioni di Git. Stavo usando la versione installata di default di Git su una casella Ubuntu 18.04 (Bionic Beaver) e tutto funzionava bene, ma quando provavo a clonare il repository usando Git su Ubuntu 16.04, alcuni file venivano mostrati come modificati.

Nessuna delle altre risposte qui ha risolto il mio problema, ma l'aggiornamento delle versioni di Git per adattarsi su entrambi i sistemi ha risolto il problema.


1
Sarebbe utile (e interessante) sapere quali versioni di git non funzionavano bene insieme.
jpaugh
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.