Cambio de mayúsculas de nombres de archivo en Git

473

Estoy tratando de cambiar el nombre de un archivo para tener una capitalización diferente de la que tenía antes:

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

Como puedes ver, Git se enoja con esto. Intenté cambiar el nombre usando solo el mvcomando anterior, pero Git no elige el cambio de nombre (como un cambio de nombre o como un nuevo archivo sin seguimiento).

¿Cómo puedo cambiar un archivo para tener una capitalización diferente del mismo nombre? Estoy en Mac OS X v10.7.3 (Lion) con Git 1.7.9.1 usando Z shell (zsh) 4.3.15.

knpwrs
fuente
49
se debe a que el sistema de archivos osx conserva las mayúsculas y minúsculas de forma predeterminada. Simplemente puede proceder en dos pasos:git mv myfile foo; git mv foo MyFile
tonio
16
Lo tengo trabajando con "git mv --force myfile MyFile".
Marcello de Sales
77
A partir de git 2.0.1 (junio de 2014), git mv hello.txt Hello.txtfuncionará en sistemas operativos que no distinguen entre mayúsculas y minúsculas. Vea mi respuesta a continuación
VonC
1
Vinculación stackoverflow.com/questions/1793735/…
Oleg Estekhin

Respuestas:

554

A partir de Git 2.0.1 (25 de junio de 2014), a git mvsolo funcionará en un sistema operativo que no distinga entre mayúsculas y minúsculas .

Ver commit baa37bf por David Turner ( dturner-tw) .

mv: permite cambiar el nombre para corregir el caso en los sistemas de archivos insensibles a mayúsculas y minúsculas

El error " git mv hello.txt Hello.txt" en un sistema de archivos insensible a mayúsculas y minúsculas siempre " destination already exists" desencadena , porque estos dos nombres se refieren a la misma ruta desde el punto de vista del sistema de archivos y requieren que el usuario dé " --force" al corregir el caso de la ruta registrada en el índice y en el siguiente compromiso

Detecta este caso y permítelo sin requerir " --force".

git mv hello.txt Hello.txtsimplemente funciona (ya no se --forcerequiere).


La otra alternativa es:

git config --global core.ignorecase false

Y cambie el nombre del archivo directamente; git add y commit.

VonC
fuente
2
FWIW esto retrocedió o nunca funcionó en Windows. Estoy en 2.15.1.windows.2 y todavía necesito usar --force
TTimo
1
@Adowrath ¡Buenas noticias!
VonC
¿Funcionará también para las mayúsculas de las extensiones? Por ejemplo, si tengo el nombre de archivo image.TXT y quiero cambiarle el nombre como image.txt
siluveru kiran kumar
@siluverukirankumar Sí. ¿Tuviste algún problema con ese caso de uso?
VonC
1
Conseguí que esto funcionara en Windows ejecutando este comando ygit config core.ignorecase false
John Targaryen
453

Teniendo en cuenta la respuesta de larsks , puede hacerlo funcionar con un solo comando con "--force":

 git mv --force myfile MyFile
Marcello de Sales
fuente
3
Si está en un sistema de archivos que no distingue entre mayúsculas y minúsculas y obtiene un error fatal "Argumento no válido", pruebe estos pasos en su lugar: stackoverflow.com/questions/3011625/…
Levi
1
Si bien esta es la respuesta correcta para el primer paso, cómo proceder para cambiar a otra rama en Mac OS X cuando la otra rama tiene la antigua capitalización. Recibo un error ****: los siguientes archivos de árbol de trabajo sin seguimiento se sobrescribirán al
finalizar la
1
Esto falló en commit para mí en Windows: Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog
98

A veces, desea cambiar la capitalización de muchos nombres de archivo en un sistema de archivos que no distingue entre mayúsculas y minúsculas (por ejemplo, en OS X o Windows). Hacer git mvcomandos se cansará rápidamente. Para hacer las cosas un poco más fáciles, esto es lo que hago:

  1. Mueva todos los archivos fuera del directorio a, digamos, el escritorio.
  2. Haz una git add . -Apara eliminar todos los archivos.
  3. Cambie el nombre de todos los archivos en el escritorio a la capitalización adecuada.
  4. Mueva todos los archivos nuevamente al directorio original.
  5. Hacer un git add .. Git debería ver que los archivos cambian de nombre.

Ahora puede hacer una confirmación diciendo que ha cambiado la capitalización del nombre del archivo.

MrHus
fuente
3
Esto viene a expensas de todo el historial en los archivos que mueves dentro y fuera, ¿verdad? Supongo que el git mv --force no tiene esta deficiencia.
LOAS
12
No, esto no eliminaría toda la historia. Tenga en cuenta que no hay compromiso entre las dos adiciones.
Michael L Perry
63

Los nombres de archivo en OS X no distinguen entre mayúsculas y minúsculas (por defecto). Esto es más un problema del sistema operativo que un problema de Git. Si elimina y lee el archivo, debe obtener lo que desea, o cambiarle el nombre a otro y luego cambiarle el nombre.

larsks
fuente
2
También puede realizar git cloneel repositorio en un sistema Linux, cambiar el nombre de los archivos y confirmarlos solo para esta situación (si tiene un sistema Linux a mano).
gitaarik
44
En realidad, los sistemas de archivos en OS X pueden distinguir entre mayúsculas y minúsculas, puede configurarlo en la instalación. Cómo verificar si una partición OS X distingue entre mayúsculas y minúsculas
Flimm
2
... de ahí el "(por defecto)" en la respuesta.
Larsks
44
Para confirmar, puede usar git rm --cached fileorfolderpara eliminar el archivo o la carpeta de git sin eliminar el archivo o la carpeta del sistema de archivos. Luego, simplemente puede agregar el archivo o la carpeta nuevamente con git add fileorfolder.
kas
32

Establecer ignorecasea falseen git config

Como la publicación original trata sobre "Cambiar la capitalización de los nombres de archivo en Git":

Si está intentando cambiar el uso de mayúsculas y minúsculas de un nombre de archivo en su proyecto, no necesita forzar el cambio de nombre desde Git. En mi opinión, preferiría cambiar las mayúsculas de mi IDE / editor y asegurarme de configurar Git correctamente para retomar el cambio de nombre.

Por defecto, una plantilla Git está configurada para ignorar mayúsculas y minúsculas (Git no distingue mayúsculas y minúsculas). Para verificar que tiene la plantilla predeterminada, use --getpara recuperar el valor de una clave específica. Use --localy --globalpara indicarle a Git si debe elegir un valor-clave de configuración de su configuración de repositorio de Git local o global. Como ejemplo, si desea buscar su clave global core.ignorecase:

git config --global --get core.ignorecase

Si esto vuelve true, asegúrese de configurarlo como:

git config --global core.ignorecase false

(Asegúrese de tener los permisos adecuados para cambiar globalmente). Y ahí lo tiene; ahora su instalación de Git no ignoraría las mayúsculas y las trataría como cambios.

Como sugerencia, si está trabajando en proyectos en varios idiomas y cree que Git no debe tratar todos los proyectos como sensibles a mayúsculas y minúsculas, solo actualice el core.ignorecasearchivo local .

Segmentario
fuente
66
Y si git config --global --get core.ignorecaseno devuelve nada. ¿Es eso true? porque después de configurarlo falsedevuelve falso (Windows 10)
fralbo
Y parece que no funciona como se esperaba. ¡Quiero decir que el cliente de escritorio ve el cambio, pero después de confirmar / sincronizar, el nombre de archivo permanece sin cambios en línea!
fralbo
Funcionó para mí (y mejor para múltiples archivos que usar git mv). También estoy asumiendo que, por defecto, se considera verdadero (es decir, está ignorando mayúsculas y minúsculas). O eso, o coincide con la política del sistema operativo para la carcasa del nombre de archivo.
Jerry
Esa es la respuesta. Solo lo usé.
Dave Everitt
1
Esta debería ser la respuesta seleccionada
Dave Everitt
7

Puede abrir el directorio ".git" y luego editar el archivo "config". En el conjunto "[core]", establezca "ignorecase = true" y listo;)

Деян Добромиров
fuente
parece que debería cambiarse a falso de modo que git distinga entre mayúsculas y minúsculas?
Jonathan
1

Para agrupar git mvarchivos en minúsculas en macOS:

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

En minúscula todos los archivos en una carpeta.

softarn
fuente
1

Este fragmento de Python mostrará git mv --forcetodos los archivos en un directorio en minúsculas. Por ejemplo, foo / Bar.js se convertirá en foo / bar.js a través degit mv foo/Bar.js foo/bar.js --force .

Modifícalo a tu gusto. Solo pensé en compartir :)

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)
sangrado
fuente
-1

Ejemplo de trabajo:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
Daniel Batista
fuente
2
Su respuesta no resuelve la pregunta original. Estás bajando la extensión
Tavo
Estoy buscando exactamente esto, pero para 500 imágenes. Quiero cambiar el nombre de ./src/images/TESTIMAGE.png a ./src/images/testimage.png en git
Mohak Londhe