git mv e cambia solo caso di directory

Mentre ho trovato una domanda simile, non ho trovato una risposta al mio problema

Quando provo a rinominare la directory da FOO a foo via git mv FOO foo ottengo

 fatal: renaming 'FOO' failed: Invalid argument 

OK. Così provo git mv FOO foo2 && git mv foo2 foo

Ma quando provo a impegnarmi tramite git commit . ottengo

 # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # foo nothing added to commit but untracked files present (use "git add" to track) 

Quando aggiungo la directory tramite git add foo non cambia nulla e git commit . mi dà di nuovo lo stesso messaggio.

Che cosa sto facendo di sbagliato? Ho pensato di usare un sistema case-sensitive (OSX) perché non posso semplicemente rinominare la directory?

Sei in un ambiente insensibile al maiuscolo / minuscolo. Inoltre, aggiungendo senza il -A non si prenderà cura del lato rimosso del mv come Git lo capisce. Avvertimento! Assicurati che non ci siano altre modifiche o file non tracciati quando lo fai, altrimenti verranno commessi come parte di questo cambiamento! git stash -u prima, fai questo e poi git stash pop after. Continua: per ovviare a questo, fai quanto segue:

 mv foo foo2 git add -A git commit -m "renaming" mv foo2 FOO git add -A git commit --amend -m "renamed foo to FOO" 

Questo è il modo di cambiare la directory di lavoro, impegnando e poi comprimendo i 2 commit. Puoi semplicemente spostare il file nell’indice, ma per qualcuno che è nuovo a git, potrebbe non essere abbastanza esplicito su ciò che sta accadendo. La versione più corta è

 git mv foo foo2 git mv foo2 FOO git commit -m "changed case of dir" 

Come suggerito in uno dei commenti, puoi anche fare un rebase interattivo ( git rebase -i HEAD~5 se è stato introdotto il caso sbagliato 5 commit fa) per risolvere il caso e non visualizzare mai il caso sbagliato in qualsiasi punto della cronologia a tutti. Devi fare attenzione se lo fai perché gli hash di commit da quel momento in poi saranno diversi e altri dovranno rebase o ri-unire il loro lavoro con quello passato recente del ramo.

Questo è legato alla correzione del nome di un file: Git non è case sensitive?

Si desidera impostare l’opzione core.ignorecase su false, che farà sì che Git presta attenzione al caso sui file system che non lo supportano in modo nativo. Per abilitare nel tuo repository:

 $ git config core.ignorecase false 

Quindi puoi rinominare il file con git mv e funzionerà come previsto.

Sono stato in grado di risolvere questo problema, usando git 1.7.7 usando un nome di file temporaneo:

 $ git mv improper_Case improve_case2 $ git mv improve_case2 improve_case $ git commit -m "" 

( git mv variante git mv -free.)

Ho incontrato questo problema in Git su Mac OS X 10.9. L’ho risolto come segue:

git rm -r --cached /path/to/directory

Questo mette in scena la directory per la cancellazione in Git, ma in realtà non rimuove alcun file fisico ( --cached ). Ciò rende anche la directory, ora con il caso corretto, mostrata nei file non tracciati.

Quindi puoi farlo:

 mv /path/to/directory /path/to/DIRECTORY git add -A /path/to/DIRECTORY 

Git riconoscerà quindi che hai rinominato i file, e quando lo fai git status dovresti vedere un certo numero di righe renamed: . Esaminali e assicurati che abbiano un aspetto corretto e, in caso affermativo, puoi eseguire normalmente le modifiche.

Forza con l’opzione -f:

 git mv -f FOO foo 

Questa è una soluzione rapida e sicura per i bug:

 git mv -f path/to/foo/* path/to/FOO/ 

Avvertimento! Rinominare sempre tutti i file nella cartella rinominata (utilizzare /* ).

Non rinominare singoli file. Questo porta a un bug, descritto in questa risposta .

Se vuoi prima vedere il risultato per primo, usa -n :

 git mv -f -n path/to/foo/* path/to/FOO/ 

Dopo aver creato un mv :

  1. Applica modifiche
  2. Checkout a qualsiasi altra revisione
  3. Torna indietro.

Ora Git avrebbe dovuto rinominare la cartella ENTRAMBI nei suoi file interni e nel file system.

Non stai usando un filesystem con distinzione tra maiuscole e minuscole in OS X a meno che tu non scelga esplicitamente tale file. HFS + può essere sensibile al maiuscolo / minuscolo, ma l’impostazione predefinita è senza distinzione tra maiuscole e minuscole.

Ecco una soluzione davvero semplice su tutto il gitfoo in questa pagina.

  1. Copia manualmente i file dal tuo progetto.
  2. git rm tutti i file.
  3. Git si impegnava come al solito.
  4. aggiungere di nuovo i file manualmente.
  5. git aggiungi tutti i file.
  6. Git si impegnava come al solito.
  7. profitto.

Ho avuto un problema correlato.

Una cartella denominata ‘Pro’ (creata per prima) e anther ‘pro’ (creata per errore). In Mac, è la stessa cosa, ma diversa in base al git.

 $ git config core.ignorecase false 

la git config rinomina i file nella cartella giusta (grazie) e crea anche i file ghost in ‘pro’ (No !!). Non ho potuto aggiungere modifiche al file ghost sulla traccia e non ho potuto eseguire il checkout di altri rami a meno che non portassi quei file con me, e non potrei neanche resettarlo in qualche modo.

Invece di quello, l’ho fatto

 $ git rm -r --cached pro $ git status // => pro files removed, new Pro files untracked $ git add Pro 

Per renderlo più sicuro, l’ho fatto in un ramo di funzionalità, e poi mi sono unito al ramo principale

Per il problema del file fantasma creato da, un guru può spiegare come e perché? Grazie in anticipo.

Migliorando la risposta di Adam Dymitruk (sciocco che SO non mi permetta di commentare la sua risposta), usando “git mv” metterà automaticamente in scena esattamente i file spostati. Non è necessario alcun deposito e il rischioso “git add -A” può essere evitato:

 old="abc"; new="ABC"; tmp="$old-renamed"; git mv "$old" "$tmp"; git commit -m "Renamed '$old' to '$tmp'."; git mv "$tmp" "$new"; git commit --amend -m "Renamed '$old' to '$new'.";