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.