2010-06-28 5 views
6

Quando copio un file sopra un altro file in una directory controllata git ... Sto vedendo git pensare che l'intero file sia cambiato invece di un piccolo pezzo ... perché?Perché git vede interi file come modificati durante la copia di file in overtop di altri file?

Ecco un esempio di ciò che intendo ... http://github.com/cmodien/fileupdatetest/commit/90309ed099e257cd98218b4504cd2cd3a3a47a27

OK ... Ho controllato la fine riga sul file ... Il file originale ha fine riga CRLF. Il file che ho incollato sull'originale ha le terminazioni di riga. Il che ha senso immagino ... Ho ottenuto il file originale da un utente di Windows e ho ricevuto il nuovo file da un utente mac.

Come posso risolvere questo problema?

+1

che cosa stai vedendo che ti fa dire git pensa tutto il file è stato modificato? –

+0

Perché ... hai effettivamente cambiato l'intero file? O il nuovo file è esattamente uguale a quello vecchio tranne in una piccola area? –

+0

Quando faccio un git diff dopo che copio e incollo il file che ho ricevuto da un collega ... il diff riporta che l'intero file è cambiato. L'unico modo in cui i file differiscono è la dimensione di 97 byte. I contenuti sono identici. – Clintm

risposta

3

Ho usato questo per risolvere il problema ...

Trying to fix line-endings with git filter-branch, but having no luck

Originariamente ho cercato di seguire questa ... http://help.github.com/dealing-with-lineendings/ ma era un po 'poco chiaro che su Mac/nix è necessario impostare nucleo .autocrlf da inserire e non vero.

L'altra piccola complicazione era che ho avuto alcuni file ignorati nel mio git ignorare che avevo bisogno di risolvere così ... quindi questo comando:

git diff --cached --name-only -z | xargs -0 git add 

stava venendo a mancare ... quindi ho dovuto correre questo ...

git diff --cached --name-only -z | xargs -0 git add -f 

per costringerlo a fissare i file ignorati così ...

4

Come accennato su twitter, (@adymitruk) si verifica un problema con i finali di linea. L'impostazione AutoCRLF probabilmente non è impostata su "false" come dovrebbe essere, a meno che non si stia eseguendo lo sviluppo multipiattaforma.

La soluzione è impostarlo su falso, correggere le terminazioni di riga impostare l'autocrlf su false, quindi su commit. Fatto questo, sarai in grado di copiare quei file e quindi vedere solo le modifiche effettive.

+0

Grazie Adam ... In realtà non avevo quel flag set ... e stavo tentando di aggiungere quel flag visto che stavo dando per scontato che fosse Git a vedere l'intero file come modificato ... ma impostando quel flag su true e eseguire una serie di test non sembrava risolvere il problema. Da allora ho rimosso quella bandiera da .gitconfig. Il problema esiste ancora. Visualizzerò un esempio e lo getterò su github. – Clintm

+0

Questo è stato anche fastidioso per me quando ho iniziato a usare Git. Una volta che hai impostato automaticamente su false, non avrai questo problema. Sarà comunque necessario eseguire un commit clean up per impostare le terminazioni di linea su ciò che sono nativamente. –

3

ci sono due scenari comuni in cui questo può accadere:

  1. Whitespace è danneggiato. Il tuo editor potrebbe convertire spazi in TAB o viceversa: basta impostarlo su Linux CodingStyle per risolvere il problema.
  2. Le terminazioni di linea sono danneggiate. Impostare core.autocrlf su false e vedere la discussione this su una nuova variabile core.eol.
Problemi correlati