Cambia caso di un file su Windows?


209

Ci sono un paio di file nella nostra base di codice controllata da git che vorrei rinominare. In particolare, voglio solo cambiare il caso del file, in modo che sourceCode.javadiventi SourceCode.java, ad esempio. Il problema: sono su una finestra di Windows e il filesystem pensa che abbiano lo stesso nome di file.

Come posso convincere Windows e Git a riconoscere quella modifica e registrarla?


3
Da Git 2.0.1+ (giugno 2014), un semplice git mvdovrebbe funzionare ( stackoverflow.com/a/24979063/6309 ). Anche su Windows.
VonC,

Risposte:


337

Dai un'occhiata qui per ulteriori suggerimenti su come farlo:

Come fare in modo che git ignori le modifiche nel caso?

O:

git mv -f name.java Name.java

8
A parte questo, questo non funziona su un filesystem FAT. Ho un po 'di codice di progetto in giro su una chiavetta USB e le modifiche ai casi sono un vero dolore.
asm

1
Questo non ha funzionato per me sul sistema NTFS e Windows 10
Roboblob

1
Questo è sicuramente il modo corretto di farlo ma, se hai bisogno di rinominare molti file, potrebbe essere noioso. Se in qualche modo li hai già rinominati nel filesystem e vuoi solo eseguire il commit di tali modifiche, puoi rinominare una cartella principale, fare una git adddi quella cartella appena rinominata, NON COMMITARE, cambiare il nome della cartella in quello che dovrebbe essere , di git addnuovo e quindi commettere.
Okonomiyaki3000,

Funziona su NTFS e Windows 7.
Hans Goldman,

È possibile farlo in blocco? ad esempio con PowerShellGet-ChildItem '.' | Rename-Item {$_.Name.ToLowerCase()}
guastafeste

49

Se si utilizza un file system FAT, l'unica scelta è eseguire una ridenominazione in due fasi:

  1. Rinomina sourceCode.javainanything.you.like
  2. Rinomina anything.you.likeinSourceCode.java

Ai tempi in cui usavamo Perforce avevamo esattamente questo problema e questa era l'unica soluzione che potevamo trovare.


13
Solo una nota per gli altri: non è necessario impegnarsi nel mezzo, ma è necessario aggiungere all'indice per git per notare il cambiamento
arberg

29

I seguenti passaggi mi hanno permesso di cambiare il caso su Windows:

  • Aggiungi ignorecase = falsea [core]in .git/config;
  • Sposta i file che vuoi rinominare dalla directory del tuo progetto;
  • Aggiungi le eliminazioni all'indice;
  • Riporta tutti i file nella loro posizione originale e cambia il caso dei file e / o delle directory;
  • Aggiungi tutti i "nuovi" file all'indice;
  • Rimuovi ignorecase = falseaggiunto al primo passaggio.

In questo modo hai un unico commit che contiene la ridenominazione e rende facile cambiare ad esempio un'intera directory.


5
Fallo per le impostazioni globali e locali del bagno: $ gti config --global core.ignorecase false $ gti config core.ignorecase false
Roman Ivanov

6

Stai attento. Ciò può portare a cambiamenti impossibili da unire. Git viene confuso quando si fonde su Windows perché non può decidere se il vecchio nome in maiuscolo e il nuovo nome in minuscolo sono lo stesso file o meno (per Git non lo sono, ma per il filesystem lo sono). Per unirti devi fare qualche soluzione manuale come eliminare i file prima di unirli.

Vedi il problema Git rebase con file con lo stesso nome ma con un caso diverso

Non sono sicuro che questo problema sia peggiore che avere un file con un nome non convenzionale nel tuo progetto per sempre, ma vale la pena sapere se ci sono molti utenti con molti rami che alla fine dovranno essere uniti tutti.


I file con nomi non convenzionali in progetti di medie e grandi dimensioni dovrebbero sempre essere evitati, se possibile, a causa di problemi durante lo sviluppo per più piattaforme (ritardare la correzione di qualcosa del genere fino a tardi renderà i problemi della correzione più gravi). A volte stai sviluppando su Windows, ma devi anche fare una build di Linux, e un'inclusione che funzionerebbe bene su Windows fa sì che la build si interrompa su Linux.
Griffork,

3

Secondo me manca un modo semplice. Puoi farlo per un singolo file, una directory specifica o anche l'intero repository:

git rm --cached <file name or directory>
git add <file name or directory>

Se vuoi influenzare anche le sottodirectory, devi usare il -rflag:

git rm -r --cached <directory>
git add <directory>

Veramente il più semplice.
ranu,

Questo perde l'intera cronologia del file, poiché è impostato da Git come completamente nuovo.
Alejandro,

@Alejandro Quello che dici è sbagliato. L'ho appena testato e git ha riconosciuto la ridenominazione senza problemi. Come in altri casi, il file viene mostrato come rimosso / nuovo nell'indice, ma durante il commit, git nota che è stato appena rinominato.
Nils-o-mat,

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.