Alterando letras maiúsculas de nomes de arquivos no Git

473

Estou tentando renomear um arquivo para ter letras maiúsculas diferentes do que tinha 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 você pode ver, o Git se encaixa nisso. Tentei renomear usando apenas o mvcomando antigo simples , mas o Git não escolhe a renomeação (como renomeação ou como um novo arquivo não rastreado).

Como posso alterar um arquivo para ter uma capitalização diferente com o mesmo nome? Estou no Mac OS X v10.7.3 (Lion) com Git 1.7.9.1 usando o shell Z (zsh) 4.3.15.

knpwrs
fonte
49
é porque o sistema de arquivos osx preserva maiúsculas e minúsculas e, por padrão, não faz distinção entre maiúsculas e minúsculas. Você pode simplesmente prosseguir em duas etapas:git mv myfile foo; git mv foo MyFile
tonio
16
Consegui trabalhar com "git mv --force myfile MyFile".
Marcello de Sales
7
A partir do git 2.0.1 (junho de 2014), git mv hello.txt Hello.txtfuncionará no sistema operacional que não diferencia maiúsculas de minúsculas. Veja minha resposta abaixo
VonC
1
Linking stackoverflow.com/questions/1793735/…
Oleg Estekhin

Respostas:

554

A partir do Git 2.0.1 (25 de junho de 2014), a git mvfuncionará apenas em um sistema operacional que não diferencia maiúsculas de minúsculas .

Veja commit baa37bf de David Turner ( dturner-tw) .

mv: permite renomear para corrigir sistemas de arquivos que não diferenciam maiúsculas de minúsculas

" git mv hello.txt Hello.txt" em um sistema de arquivos que não diferencia maiúsculas de minúsculas sempre " destination already exists" dispara , porque esses dois nomes se referem ao mesmo caminho do ponto de vista do sistema de arquivos e exigem que o usuário forneça " --force" ao corrigir o caso do caminho registrado no índice e no diretório próximo commit.

Detecte este caso e permita-o sem precisar " --force".

git mv hello.txt Hello.txtsimplesmente funciona (não é --forcemais necessário).


A outra alternativa é:

git config --global core.ignorecase false

E renomeie o arquivo diretamente; git add e commit.

VonC
fonte
2
FWIW isso regrediu ou nunca funcionou no Windows. Estou em 2.15.1.windows.2 e ainda preciso usar --force
TTimo
1
@Adowrath Ótimas notícias!
VonC
Será que este trabalho para a capitalização extensões também Por exemplo, se tem um nome de arquivo image.TXT e eu quero mudar o nome como image.txt
siluveru Kiran Kumar
@siluverukirankumar Sim. Você teve algum problema com esse caso?
VonC 21/06/19
1
Isso funcionou no Windows executando este comando egit config core.ignorecase false
John Targaryen
452

Considerando a resposta do larsks , você pode fazê-lo funcionar com um único comando com "--force":

 git mv --force myfile MyFile
Marcello de Sales
fonte
3
Se você estiver em um sistema de arquivos que não diferencia maiúsculas de minúsculas e obtiver um erro fatal "Argumento inválido", tente estas etapas: stackoverflow.com/questions/3011625/…
Levi
1
Embora essa seja a resposta correta para a primeira etapa, como proceder para mudar para outra ramificação no Mac OS X quando a outra ramificação tiver a capitalização antiga. Eu recebo o erro ****: Os seguintes arquivos da árvore de trabalho não
rastreados
1
Isso falhou no commit para mim no Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog 02/02
98

Às vezes, você deseja alterar a capitalização de muitos nomes de arquivos em um sistema de arquivos que não diferencia maiúsculas de minúsculas (por exemplo, no OS X ou Windows). Executar git mvcomandos se cansará rapidamente. Para facilitar um pouco as coisas, é isso que eu faço:

  1. Mova todos os arquivos para fora do diretório para, digamos, a área de trabalho.
  2. Faça um git add . -Apara remover todos os arquivos.
  3. Renomeie todos os arquivos na área de trabalho para a capitalização adequada.
  4. Mova todos os arquivos de volta para o diretório original.
  5. Faça um git add .. O Git deve ver que os arquivos foram renomeados.

Agora você pode fazer uma confirmação dizendo que alterou a capitalização do nome do arquivo.

MrHus
fonte
3
Isso acontece às custas de todo o histórico dos arquivos que você move e sai, certo? Eu estou supondo que o git mv --force não tem essa deficiência.
LOAS 4/18
12
Não, isso não removeria toda a história. Observe que não há confirmação entre as duas adições.
Michael L Perry
63

Os nomes de arquivo no OS X não diferenciam maiúsculas de minúsculas (por padrão). Isso é mais um problema do SO do que um problema do Git. Se você remover e ler o arquivo, deverá obter o que deseja ou renomeá-lo para outra coisa e renomeá-lo novamente.

larsks
fonte
2
Você também pode git clonerepo em um sistema Linux, renomear os arquivos e enviá-los apenas para esta situação (se você tiver um sistema Linux em mãos).
Gitaarik
4
Na verdade, os sistemas de arquivos no OS X podem fazer distinção entre maiúsculas e minúsculas, você pode configurá-lo na instalação. Como verificar se uma partição OS X é sensível a maiúsculas
Flimm
2
... daí o "(por padrão)" na resposta.
Larsks 18/08
4
Para confirmar, você pode git rm --cached fileorfolderremover o arquivo ou pasta do git sem remover o arquivo ou a pasta do sistema de arquivos. Em seguida, você pode simplesmente adicionar o arquivo ou a pasta novamente com git add fileorfolder.
kas
32

Definido ignorecasecomo falsena configuração do git

Como o post original é sobre "Alterando a capitalização de nomes de arquivos no Git":

Se você está tentando alterar a capitalização de um nome de arquivo no seu projeto, não precisa forçar o renomeio do Git. Na IMO, prefiro alterar a capitalização do meu IDE / editor e certifique-se de configurar o Git corretamente para pegar a renomeação.

Por padrão, um modelo Git é definido para ignorar maiúsculas e minúsculas (sem distinção entre maiúsculas e minúsculas). Para verificar se você tem o modelo padrão, use --getpara recuperar o valor de uma chave especificada. Use --locale --globalpara indicar ao Git se deve selecionar um valor-chave de configuração na configuração do repositório Git local ou global. Como exemplo, se você deseja pesquisar sua chave global core.ignorecase:

git config --global --get core.ignorecase

Se isso retornar true, defina-o como:

git config --global core.ignorecase false

(Verifique se você possui permissões adequadas para mudar global.) E aí está; agora sua instalação do Git não ignoraria letras maiúsculas e as trataria como alterações.

Como sugestão, se você estiver trabalhando em projetos em vários idiomas e achar que nem todos os projetos devem ser tratados com distinção entre maiúsculas e minúsculas pelo Git, basta atualizar o core.ignorecasearquivo local .

Segmentado
fonte
6
E se git config --global --get core.ignorecasenão retornar nada. É true?? porque depois que eu defini-lo como falseele retorna false (Windows 10)
fralbo
E parece não funcionar como esperado. Quero dizer, o cliente de desktop vê a alteração, mas após a confirmação / sincronização, o nome do arquivo permanece inalterado online!
Fralbo 7/01
Trabalhou para mim (e melhor para vários arquivos do que para usar git mv). Também estou assumindo que, por padrão, é considerado verdadeiro (ou seja, está ignorando o caso). Ou isso, ou corresponde à política do sistema operacional para especificar a caixa do nome do arquivo.
Jerry
Essa é a resposta. Apenas usei.
Dave Everitt
1
Esta deve ser a resposta selecionada
Dave Everitt 17/04
7

Você pode abrir o diretório ".git" e editar o arquivo "config". No conjunto "[core]", defina "ignorecase = true" e pronto;)

Деян Добромиров
fonte
parece que deve ser alterado para falso, de modo que o git faça distinção entre maiúsculas e minúsculas?
Jonathan
1

Para git mvarquivos em massa para minúsculas no macOS:

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

Ele minúscula todos os arquivos em uma pasta.

softarn
fonte
1

Esse snippet do Python fará com que git mv --forcetodos os arquivos em um diretório sejam minúsculos. Por exemplo, foo / Bar.js se tornará foo / bar.js viagit mv foo/Bar.js foo/bar.js --force .

Modifique-o ao seu gosto. Eu apenas pensei em compartilhar :)

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)
blended
fonte
-1

Exemplo de trabalho:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
Daniel Batista
fonte
2
Sua resposta não resolve a pergunta original. Você está usando a extensão em letras minúsculas
Tavo
Estou procurando exatamente isso, mas com 500 imagens. i deseja renomear ./src/images/TESTIMAGE.png para ./src/images/testimage.png em git
Mohak Londhe