Come faccio a forzare git a eseguire il checkout del ramo principale e rimuovere i ritorni a capo dopo aver normalizzato i file utilizzando l'attributo "text"?


101

Ok, quindi ho aggiunto il file .gitattributescon linee come questa

*.css text
*.js text
etc...

Ho quindi seguito le istruzioni su http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

$ 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"

Ma ora la mia copia di lavoro ha ancora i resi! Ho file non tracciati che vorrei conservare. Come faccio a controllare nuovamente con git il ramo principale con i file normalizzati?

So che i file sono normalizzati nel repository perché quando clono il repository, ho tutti i file senza i ritorni a capo.

Risposte:


264

Ah ah! Controlla il commit precedente, quindi controlla il master.

git checkout HEAD^
git checkout -f master

5
Grazie per questa soluzione alternativa, ma è un problema lampante in git che "checkout -f" non forza il checkout. Un altro problema potrebbe essere quello di rimuovere prima tutti i file di copia di lavoro (cioè tutto tranne .git dir).
falco

Ah, sì, grazie per questo! Sentendo questo, immagino che potremmo semplicemente rimuovere i file di interesse ed eseguire il checkout. Per me in realtà c'era un solo file che stavo cercando di correggere. Ma ovviamente potrebbero essere tutti i file, centinaia o migliaia.
Jason

Questo fallisce su git 1.8.3 (mac) con: errore: pathspec 'HEAD ^' non corrisponde ad alcun file noto a git.
dval

@dval, guarda le modifiche a questo post e vedrai un modo alternativo per farlo. Sto anche utilizzando un Mac e questo ha funzionato per me. Ti incoraggio anche ad aggiornare il tuo git a 2+ e puoi usare Homebrew per farlo in modo sicuro e manutenibile.
Jason

2
Questo non funziona davvero. GIT aggiornerà solo i file che sono cambiati tra i due commit (con alcune eccezioni). Se un repository è nuovo di zecca, ad es. solo due commit e il primo sembra essere vuoto, quindi questa soluzione funzionerà. Altrimenti, è necessario eliminare forzatamente tutti i file come descritto dalla risposta di mechsin.
jstine

16

Come altri hanno sottolineato, è possibile eliminare tutti i file nel repository e quindi controllarli. Preferisco questo metodo e può essere fatto con il codice sottostante

git ls-files -z | xargs -0 rm
git checkout -- .

o una riga

git ls-files -z | xargs -0 rm ; git checkout -- .

Lo uso sempre e non ho ancora trovato alcun aspetto negativo!

Per qualche ulteriore spiegazione, -zaggiunge un carattere nullo alla fine di ogni entrata in uscita dals-files , e -0dice xargsdi delimitare l'output che stava ricevendo da quei caratteri nulli.

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.