git mv y solo cambia mayúsculas y minúsculas del directorio

266

Si bien encontré una pregunta similar , no encontré una respuesta a mi problema

Cuando intento cambiar el nombre del directorio de FOO a foo a través de git mv FOO foo, obtengo

fatal: renaming 'FOO' failed: Invalid argument

OKAY. Así que intentogit mv FOO foo2 && git mv foo2 foo

Pero cuando trato de comprometerme git commit ., obtengo

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

Cuando agrego el directorio a través de git add foonada cambia y git commit .me vuelve a dar el mismo mensaje.

¿Qué estoy haciendo mal? Pensé que estaba usando un sistema que distingue entre mayúsculas y minúsculas (OSX), ¿por qué no puedo simplemente cambiar el nombre del directorio?

oschrenk
fuente
10
El sistema de archivos de OS X no distingue entre mayúsculas y minúsculas.
mipadi
2
@mipadi Puede funcionar en modo sensible a mayúsculas y minúsculas, pero normalmente está desactivado de forma predeterminada.
GordonM
1
Esta pregunta y sus respuestas también son útiles en Windows. Considere quitar la etiqueta "osx"
Barett
1
Ver stackoverflow.com/a/24979063/6309 : desde git 2.0.1, un simple git mvfunciona.
VonC
En Windows, puede usar el estándar git mv foo Foosi usa un shell cygwin.
Andrew Scott

Respuestas:

420

Estás en un entorno que no distingue entre mayúsculas y minúsculas. Además, agregar sin el -Ano se ocupará del lado de eliminar mvcomo lo entiende Git. ¡Advertencia! Asegúrese de que no haya otros cambios o archivos sin seguimiento cuando haga esto o se confirmarán como parte de este cambio. git stash -uprimero, haz esto y luego git stash popdespués. Continuando: Para evitar esto, haga lo siguiente:

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

Esa es la forma extraída de cambiar el directorio de trabajo, confirmar y luego contraer las 2 confirmaciones. Puede simplemente mover el archivo en el índice, pero para alguien que sea nuevo en git, puede que no sea lo suficientemente explícito en cuanto a lo que está sucediendo. La versión más corta es

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

Como se sugiere en uno de los comentarios, también puede hacer una rebase interactiva (git rebase -i HEAD~5 si se introdujo el caso incorrecto hace 5 confirmaciones) para arreglar el caso allí y no que aparezca el caso incorrecto en ningún lugar del historial. Debe tener cuidado si hace esto, ya que los hashes de confirmación a partir de ese momento serán diferentes y otros tendrán que reajustar o fusionar su trabajo con el pasado reciente de la rama.

Esto está relacionado con la corrección del nombre de un archivo: ¿git no distingue entre mayúsculas y minúsculas?

Adam Dymitruk
fuente
1
Gracias. Esto me estaba volviendo loco. No sabía acerca de la opción -A o --amend.
oschrenk
7
Tenga cuidado con la -A, ya que agregará de forma recursiva todo el contenido de su directorio actual, incluidas las cosas sin seguimiento. Podría ser mejor simplemente git add foo2.
rich.e
2
Eso es correcto. Sin embargo, deberá organizar tanto la eliminación de foo2 como la adición de FOO por separado. -Ase ocupa de ambos. Viceversa para el primer paso. Agregaré la advertencia. ¡Gracias!
Adam Dymitruk
También puede limpiar su historial con una base de datos interactiva git rebase -i HEAD~2. Nota: Para simplificar esto, configure el mensaje final en su primera confirmación y arregle la segunda.
Alex B.
5
Tuve éxito con git mv foo foo2; git mv foo2 FOO; git commit
Chris
146

Desea establecer la opción core.ignorecaseen falso, lo que hará que Git preste atención al caso en los sistemas de archivos que no lo admiten de forma nativa. Para habilitar en su repositorio:

$ git config core.ignorecase false

Luego, puede cambiar el nombre del archivo con git mvy funcionará como se esperaba.

mipadi
fuente
2
Creo que esto puede tener efectos indeseables en otros lugares. Los sistemas que no distinguen entre mayúsculas y minúsculas deberían permitir que Git piense que es el mismo directorio.
Adam Dymitruk
2
Agregué
3
Veo un comportamiento extraño al usar esto con OSX. hrm I modified a file that doesn't exist.. hrm error: The following untracked working tree files would be overwritten by checkout:pero ... esos archivos no existen.
Skylar Saveland
Esto era exactamente lo que estaba buscando. Estoy ejecutando CentOS 5.6 y no recogió el cambio de caso.
crmpicco
5
¡Esto no funciona! En Git 1.8.3, Git tratará el archivo renombrado como un archivo nuevo, en lugar de eliminarlo + agregarlo. Confirmarlo dejará el repositorio con dos archivos iguales, por ejemplo, ¡foo y FOO existen! Pero cuando el proceso de pago solo aparece un archivo (pero un caso puede dominar el otro caso)
Johnny Wong
71

Pude resolver esto, usando git 1.7.7 usando un nombre de archivo temporal:

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"
mgadda
fuente
Interesante. Quizás GIT haya mejorado algo desde entonces. Cuando me vuelva a encontrar con este problema, lo intentaré de nuevo.
oschrenk
mucho más fácil hacerlo de esta manera
olore
Funcionó para mí en macOS.
Mr_Pouet
14

( git mv-Variante libre.)

Me encontré con este problema en Git en Mac OS X 10.9. Lo resolví de la siguiente manera:

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

Eso prepara el directorio para su eliminación en Git pero en realidad no elimina ningún archivo físico ( --cached). Esto también hace que el directorio, ahora con el caso adecuado, se muestre en archivos sin seguimiento.

Entonces puedes hacer esto:

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

Git reconocerá que ha cambiado el nombre de los archivos y, cuando lo haga git status, debería ver una serie de renamed:líneas. Inspeccione y asegúrese de que se vean correctos, y si es así, puede confirmar los cambios normalmente.

wizonesolutions
fuente
Descubrí que el mvcomando no funcionaba para cambiar el nombre del directorio; Tuve que cambiarle el nombre dentro de Finder. Aparte de eso, esta solución funciona perfectamente.
Adam S
9

Esta es una solución rápida y segura contra errores:

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

¡Advertencia! Cambie siempre el nombre de todos los archivos en la carpeta renombrada (usar /*).

No cambie el nombre de archivos individuales. Esto conduce a un error, que se describe en esta respuesta .

Si primero desea ver el resultado primero, use -n:

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

Después de haber hecho un mv:

  1. Cometer cambios
  2. Ir a cualquier otra revisión
  3. Volver a pagar.

Ahora Git debería haber cambiado el nombre de la carpeta TANTO en sus archivos internos como en el sistema de archivos.

Nick Volynkin
fuente
¿Es esto solo para Git 2.0.1 como mencioné en los comentarios de las preguntas anteriores? (refiriéndose a stackoverflow.com/a/24979063/6309 )
VonC
8

Forzarlo con la opción -f:

git mv -f FOO foo
Konyak
fuente
No funciona para mi. Mi configuración es "ignorecase = true" de .git / config. El cambio de nombre no se puede organizar en el área de preparación de esta manera. (Git versión 1.8.3.msysgit.0) La solución de Adam Dymitruk es la única respuesta correcta.
Johnny Wong
@JohnnyWong cambia tu configuración a false, funcionó para mí
Inder Kumar Rathore
¿Se actualizará esto en todas las computadoras de los demás usuarios si extraen, incluso si su computadora está configurada para ignorar mayúsculas y minúsculas?
Bryce
@Bryce No, deberá confirmar los cambios y enviarlos al repositorio central antes de que otros usuarios puedan realizar los cambios.
konyak
4

Tuve un problema relacionado.

Una carpeta llamada 'Pro' (creada primero) y otra 'pro' (creada por error). En Mac, es lo mismo, pero diferente según git.

$ git config core.ignorecase false

la configuración de git cambia el nombre de los archivos a la carpeta correcta (gracias), y también creó archivos fantasma en 'pro' (¡¡No !!). No pude agregar cambios de archivos fantasma a la pista y no pude verificar otras ramas a menos que lleve esos archivos conmigo, y tampoco pude restablecerlos de alguna manera.

En lugar de eso, lo hice

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

Para que sea más seguro, lo hice en una rama de reparación separada, y luego me fusioné con la rama principal

Para el problema del archivo fantasma creado por, ¿algún gurú puede explicar cómo y por qué? Gracias por adelantado.

Seeliang
fuente
2

No está utilizando un sistema de archivos que distingue entre mayúsculas y minúsculas en OS X a menos que lo elija explícitamente. HFS + puede distinguir entre mayúsculas y minúsculas, pero el valor predeterminado no distingue entre mayúsculas y minúsculas.

Nicholas Knight
fuente
4
Usar el sistema de archivos que distingue entre mayúsculas y minúsculas en OS X no es una buena idea. Muchas aplicaciones NO funcionan correctamente, aprendí al probar esto. Un problema particular es que Adobe Photoshop se negará a instalar diciendo que el sistema de archivos que distingue entre mayúsculas y minúsculas no es compatible.
jpswain
1

Aquí hay una solución realmente simple para todo el gitfoo en esta página.

  1. Copie los archivos de su proyecto manualmente.
  2. git rm todos los archivos.
  3. git commit como de costumbre.
  4. vuelva a agregar los archivos manualmente.
  5. git agrega todos los archivos.
  6. git commit como de costumbre.
  7. lucro.
Askdesigners
fuente
1
Esto funciona localmente, pero si alguien más lo hace, no cambiará su caso.
Jason
Gracias por ayudarme a corregir las entradas dobles en git con diferentes casos. Usé una variante de esto. Acabo de cambiar el nombre de la carpeta principal. Hizo un compromiso. Luego se cambió el nombre de la carpeta principal a la original. E hizo un segundo compromiso. Ahora las entradas más antiguas con el caso diferente se han ido.
dreamerkumar
0

Al mejorar la respuesta de Adam Dymitruk (es una tontería que SO no me deje comentar su respuesta), el uso de "git mv" pondrá automáticamente en escena exactamente los archivos movidos. No se necesita ocultar y se puede evitar el arriesgado "git add -A":

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'.";
Rainer Blome
fuente
0

Esto funcionó muy bien para mí en Windows. Powershell usado con lo siguiente:

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (Opcional) git push

Gracias a la respuesta de Adam anterior.

Tony
fuente