Cambio la capitalizzazione di una directory e Git non sembra prenderla in considerazione


139

Sto sviluppando un progetto su OS X Lion che è sotto il controllo della versione di Git. Ho avuto queste directory minuscole e poi le ho scritte in maiuscolo (ad esempio emailaddresses => EmailAddresses), ma Git non sembra riconoscere la modifica. Pensa ancora che le directory siano minuscole quando corro git ls-filese altri comandi.

È innocuo o dovrei fare qualcos'altro per convincere Git a capire questo cambiamento?



Questo ha creato confusione per me per 2 giorni. Ora capisco. Grazie per questa domanda
Numero 945

Risposte:


199

Probabilmente stai usando HFS + senza distinzione tra maiuscole e minuscole (ma preservando le maiuscole). Di solito ci lavoro intorno così:

$ git mv somename tmpname
$ git mv tmpname SomeName

1
Questo è lo stesso problema che ho, ed è quello che faccio.
Fernfret

3
Ha avuto lo stesso problema con lo strumento Github per Windows. Ancora una volta la soluzione sopra risolve il problema: rinominare in un file temporaneo in Windows Exploer, quindi - dopo aver eseguito il commit - rinominare il nome finale con il caso corretto.
Jason,

9
O di farlo in un solo comando: git mv --force nomeacaso SomeName (da stackoverflow.com/a/16071375/217866 )
jackocnr

1
Affinché le modifiche si riflettano nel repository remoto, è necessario anche git push origin master. Se git rifiuta di aggiornare il telecomando, potrebbe essere necessario aggiungere un file fittizio (ad es. touch stam) E fare il push. Seguito da una successiva eliminazione di stam e premere di nuovo.
Rahav,

2
Una cosa da notare è che devi trovarti nella cartella in cui il file deve funzionare. All'inizio non è stato ovvio per me e ho continuato a ricevere >>> bad source, source = somename, destination = tmpname <<< perché stavo cercando di eseguire il comando dalla radice del repository.
Parth Tamane,

281

Puoi dire a git di tenere conto del caso eseguendo

git config core.ignorecase false


4
Davvero un'ottima risposta se hai già cambiato i nomi dei file senza usare git mv --force o qualche altro script CL. Grazie!
MeanMatt il

4
Questa è la risposta migliore perché non mi andava particolarmente di git mvare manualmente 200 file rinominati!
Adam Reis,

1
Concordato che questa dovrebbe essere la risposta migliore. Grazie.
HomerPlata,

1
per qualche motivo ha duplicato tutti i file, ora ho cambiato sia la versione originale che quella con maiuscole ...
Salatiel

1
@Salatiel Immagino che li duplica quando stai già monitorando il file.
Iggy,

36

Come attivare mv su Mac Case-Sensitively

Questo sta accadendo perché Mac OS X implementa funzionalità di conservazione e insensibilità delle maiuscole che intendono aiutarti.

Sebbene i suggerimenti per la doppia ridenominazione nell'altra risposta funzioneranno, raccomando l'uso di '--force' per un risultato di best practice:

$ git mv --force somename SomeName


Nota: se provi senza l'opzione force, git ti mostrerà in questo modo:

$ git mv somename SomeName
$ fatal: destination exists, source=somename, destination=SomeName

Nell'esempio sopra, il comando git ha esito negativo e nessun file viene modificato nel filesystem o nell'indice di git.


Al primo comando, ottengo fatal: not under version control.
2540625,

Quell'errore fatale significa che non hai un repository GIT in quella posizione. giti comandi funzionano solo in directory con repository GIT.
David Manpearl,

Ma ero in una sottodirectory del mio repository Git ... Alla fine l'ho risolto tramite la risposta di Taran , BTW. Grazie.
2540625,


4

I seguenti passaggi mi hanno aiutato a risolvere il problema:

  1. Rinomina la cartella in temp:

    mv Folder temp                  // It will rename your Folder to temp
    
  2. Stage e impegno:

    git add .
    git commit -m "Temp"
    
  3. Rinomina tempcartella a tua scelta:

    mv temp folder        // It will rename temp folder to the name of your choice(folder)
    git add .
    git commit -m "Folder Fixed"
    

Fatto: ora puoi spingere.


1

Se lo fai git mv AAA aaao git mv -f AAA aaa, non funzionerà e avrai un errore fatal: renaming 'AAA' failed: Invalid argument.

Poiché AAAe aaasono UNA STESSA cartella / file su file system senza distinzione tra maiuscole e minuscole, passare AAAa aaasignifica spostare AAAcome aaa/AAA.

Quindi dovresti farlo

git mv AAA aaa.1
git mv aaa.1 aaa

Spero che ti sarà utile.


1

La ragione di ciò è che il sistema operativo basato su LINUX o macOS ignorano la distinzione tra maiuscole e minuscole per il nome di file / cartella. Dobbiamo risolvere questo problema con i passaggi seguenti

For Exp, you want to change folder name from Base to base
1. mv Base base2
2. git add . && git commit -m "Fix folder name problem (wip)"
3. mv base2 base
4. git add . && git commit -m "Fixed folder name problem"

0

Nessuna di queste soluzioni ha funzionato per me. SourceTree ha sempre creato il mio ramo con un caso diverso da quello che volevo. Quindi come ho risolto è stato:

1 - Guarda i tuoi file git su finder. Puoi farlo digitando questo sul terminale:

- `defaults write com.apple.finder AppleShowAllFiles TRUE`
- `killall Finder`

2 - Riavvia il Finder e vai alla directory del tuo progetto

3 - Ora basta cambiare il nome della cartella, diciamo da Funzione a Funzione. E il gioco è fatto.



0

Ho avuto lo stesso problema e utilizzo la soluzione di seguito. Lo uso per rinominazioni batch, directory e file, ecc:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning updated directory/file names"
git push origin master

Come dettagliato qui.


0

Nessuno di questi in realtà mi ha aiutato, stavo ancora facendo in modo che mi dicesse di nascondere le mie modifiche, perché la mia situazione era che la mia cartella locale era in maiuscolo ma il telecomando no, e il mio ramo era indietro e non potevo più tirare a causa delle differenze di capitalizzazione dei file nella struttura delle cartelle.

L'unico modo per risolvere il problema era eliminare il mio ramo locale e controllare il telecomando.

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.