Modifica delle maiuscole nei nomi dei file in Git


473

Sto cercando di rinominare un file in modo che abbia una diversa capitalizzazione rispetto a quello che aveva prima:

git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js

Come puoi vedere, Git si adatta a questo. Ho provato a rinominare usando solo il semplice vecchio mvcomando, ma Git non prende il nome (come rinominare o come nuovo file non tracciato).

Come posso modificare un file per avere una diversa maiuscola con lo stesso nome? Sono su Mac OS X v10.7.3 (Lion) con Git 1.7.9.1 usando la shell Z (zsh) 4.3.15.


49
è perché il file system osx preserva le maiuscole e le minuscole per impostazione predefinita. Puoi semplicemente procedere in due passaggi:git mv myfile foo; git mv foo MyFile
tonio

16
Funzionato con "git mv --force myfile MyFile".
Marcello de Sales,


7
A partire da git 2.0.1 (giugno 2014), git mv hello.txt Hello.txtfunzionerà su sistemi operativi senza distinzione tra maiuscole e minuscole. Vedi la mia risposta di seguito
VonC,

Risposte:


554

A partire da Git 2.0.1 (25 giugno 2014), git mvfunzionerà solo su un sistema operativo senza distinzione tra maiuscole e minuscole .

Vedi commit baa37bf di David Turner ( dturner-tw) .

mv: consente la ridenominazione per correggere il caso su filesystem insensibili al maiuscolo / minuscolo

L' errore " git mv hello.txt Hello.txt" su un filesystem insensibile al mai fa scattare " destination already exists" errore, perché questi due nomi si riferiscono allo stesso percorso dal punto di vista del filesystem e richiedono all'utente di dare " --force" quando correggono il caso del percorso registrato nell'indice e nel prossimo impegno.

Rileva questo caso e consentilo senza " --force".

git mv hello.txt Hello.txtfunziona solo (non --forcepiù richiesto).


L'altra alternativa è:

git config --global core.ignorecase false

E rinominare il file direttamente; git add e commit.


2
FWIW questo è regredito o non ha mai funzionato su Windows. Sono il 2.15.1.windows.2 e devo ancora usare --force
TTimo il

1
@Adowrath Grandi notizie!
VonC,

Funzionerà anche con le maiuscole delle estensioni Ad esempio, se si ha il nome del file image.TXT e voglio rinominarlo come image.txt
siluveru kiran kumar

@siluverukirankumar Sì. Hai avuto problemi con quel caso d'uso?
VonC,

1
Ho ottenuto che funzioni su Windows eseguendo questo comando egit config core.ignorecase false
John Targaryen

452

Considerando la risposta di Larsks , puoi farlo funzionare con un singolo comando con "--force":

 git mv --force myfile MyFile

3
Se si utilizza un file system senza distinzione tra maiuscole e minuscole e si verifica un errore irreversibile "Argomento non valido", provare invece questi passaggi: stackoverflow.com/questions/3011625/…
Levi

1
Mentre questa è la risposta corretta per il primo passo, come procedere quindi per passare a un altro ramo in Mac OS X quando l'altro ramo ha la vecchia maiuscola.
Viene visualizzato l'

1
Questo non è riuscito a eseguire il commit per me su Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog,

98

A volte vuoi cambiare la maiuscola di molti nomi di file su un filesystem senza distinzione tra maiuscole e minuscole (ad es. Su OS X o Windows). L'esecuzione dei git mvcomandi si stancherà rapidamente. Per semplificare un po 'le cose, questo è quello che faccio:

  1. Sposta tutti i file all'esterno della directory, diciamo sul desktop.
  2. Fare un git add . -Aper rimuovere tutti i file.
  3. Rinomina tutti i file sul desktop con la corretta maiuscola.
  4. Sposta tutti i file nella directory originale.
  5. Fare un git add .. Git dovrebbe vedere che i file sono stati rinominati.

Ora puoi eseguire un commit dicendo che hai modificato la capitalizzazione del nome file.


3
Questo a scapito di tutta la cronologia dei file che si spostano dentro e fuori, giusto? Immagino che git mv - force non abbia questo difetto.
LOAS

12
No, questo non eliminerebbe tutta la storia. Si noti che non esiste alcun commit tra i due add.
Michael L Perry,

63

I nomi dei file in OS X non fanno distinzione tra maiuscole e minuscole (per impostazione predefinita). Questo è più un problema del sistema operativo che un problema Git. Se rimuovi e leggi il file, dovresti ottenere ciò che desideri o rinominarlo in qualcos'altro e quindi rinominarlo.


2
Puoi anche git clonerepository su un sistema Linux, rinominare i file e impegnarli solo per questa situazione (se hai un sistema Linux a portata di mano).
gitaarik,

4
In realtà, i filesystem su OS X possono fare distinzione tra maiuscole e minuscole, è possibile configurarlo al momento dell'installazione. Come verificare se una partizione OS X fa distinzione tra maiuscole e minuscole
Flimm,

2
... da qui il "(predefinito)" nella risposta.
Larks,

4
Per confermare, puoi usare git rm --cached fileorfolderper rimuovere il file o la cartella da git senza rimuovere il file o la cartella dal file system. Quindi puoi semplicemente aggiungere nuovamente il file o la cartella con git add fileorfolder.
kas,

32

Imposta ignorecasesufalse in git config

Poiché il post originale parla di "Modifica delle maiuscole nei nomi dei file in Git":

Se stai cercando di modificare le maiuscole di un nome file nel tuo progetto, non è necessario forzare rinominarlo da Git. IMO, preferirei cambiare la capitalizzazione dal mio IDE / editor e assicurarmi di configurare Git correttamente per riprendere la ridenominazione.

Per impostazione predefinita, un modello Git è impostato per ignorare maiuscole / minuscole (maiuscole e minuscole Git). Per verificare di disporre del modello predefinito, utilizzare --getper recuperare il valore per una chiave specificata. Utilizzare --locale --globalper indicare a Git se prelevare un valore-chiave di configurazione dalla configurazione del proprio repository Git locale o globale. Ad esempio, se si desidera cercare la chiave globale core.ignorecase:

git config --global --get core.ignorecase

Se questo ritorna true, assicurati di impostarlo come:

git config --global core.ignorecase false

(Assicurati di avere i permessi adeguati per cambiare globale.) E lì ce l'hai; ora la tua installazione di Git non ignorerebbe le maiuscole e le tratterà come modifiche.

Come suggerimento, se stai lavorando a progetti multilingue e ritieni che non tutti i progetti debbano essere trattati con distinzione tra maiuscole e minuscole da Git, aggiorna semplicemente il core.ignorecasefile locale .


6
E se git config --global --get core.ignorecasenon restituisce nulla. È true?? perché dopo averlo impostato su falserestituisce false (Windows 10)
fralbo

E sembra non funzionare come previsto. Voglio dire che il client desktop vede la modifica ma dopo il commit / la sincronizzazione, il nome del file rimane invariato online!
fralbo,

Ha funzionato per me (e meglio per più file rispetto all'utilizzo git mv). Suppongo anche che per impostazione predefinita sia considerato vero (ovvero ignora il caso). O quello, o corrisponde alla politica del sistema operativo al case dei nomi dei file.
Jerry,

Questa è la risposta. L'ho appena usato.
Dave Everitt,

1
Questa dovrebbe essere la risposta selezionata
Dave Everitt il

7

È possibile aprire la directory ".git" e quindi modificare il file "config". In "[core]" set, impostare "ignorecase = true" e il gioco è fatto;)


sembra che dovrebbe essere cambiato in falso in modo tale che Git sia sensibile al maiuscolo / minuscolo?
Jonathan,

1

Per git mveseguire il bulk dei file in minuscolo su macOS:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

Minuscola tutti i file in una cartella.


1

Questo frammento di Python renderà git mv --forcetutti i file in una directory in minuscolo. Ad esempio, foo / Bar.js diventerà foo / bar.js tramitegit mv foo/Bar.js foo/bar.js --force .

Modificalo a tuo piacimento. Ho appena pensato di condividere :)

import os
import re

searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)

for root, dirs, files in os.walk(searchDir):
    dirs[:] = [d for d in dirs if d not in exclude]
    for f in files:
        if re.match(r'[A-Z]', f):
            fullPath = os.path.join(root, f)
            fullPathLower = os.path.join(root, f[0].lower() + f[1:])
            command = 'git mv --force ' + fullPath + ' ' + fullPathLower
            print(command)
            os.system(command)

-1

Esempio funzionante:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png

2
La tua risposta non risolve la domanda originale. Stai riducendo l'estensione
Tavo,

Sto cercando esattamente questo, ma per 500 immagini. voglio rinominare ./src/images/TESTIMAGE.png in ./src/images/testimage.png su git
Mohak Londhe,
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.