Alterar maiúsculas e minúsculas de um arquivo no Windows?

209

Há alguns arquivos em nossa base de código controlada por git que eu gostaria de renomear. Especificamente, eu só quero mudar o caso do arquivo, para que sourceCode.javase torne SourceCode.java, por exemplo. O problema: estou em uma caixa do Windows, e o sistema de arquivos acha que esses são o mesmo nome de arquivo.

Como faço para que o Windows e o Git reconheçam essa alteração e façam check-in?

Electrons_Ahoy
fonte
3
Desde o Git 2.0.1+ (junho de 2014), um simples git mvdeve funcionar ( stackoverflow.com/a/24979063/6309 ). Mesmo no Windows.
VonC

Respostas:

337

Dê uma olhada aqui para obter mais dicas sobre como fazê-lo:

Como fazer o git ignorar mudanças no caso?

Ou:

git mv -f name.java Name.java
Igor Zevaka
fonte
8
Como um aparte, isso não funciona em um sistema de arquivos FAT. Eu carrego algum código do projeto em um pen drive e as alterações de caso são uma verdadeira dor de cabeça.
Asm
1
Isso não funcionou para mim no sistema NTFS e no Windows 10
Roboblob 7/18/18
1
Essa é certamente a maneira correta de fazer isso, mas, se você precisar renomear muitos arquivos, pode ser entediante. Se você já os renomeou no sistema de arquivos de alguma forma e apenas deseja confirmar essas alterações, é possível renomear alguma pasta pai, fazer uma git adddessa pasta recém-renomeada, NÃO COMPROMETIR, alterar o nome da pasta para o que deveria ser , git addnovamente e depois confirme.
Okonomiyaki3000
Funciona em NTFS e Windows 7.
Hans Goldman
É possível fazer isso em massa? por exemplo, com powershell,Get-ChildItem '.' | Rename-Item {$_.Name.ToLowerCase()}
killjoy
49

Se você estiver em um sistema de arquivos FAT, sua única opção é renomear em dois estágios:

  1. Renomear sourceCode.javaparaanything.you.like
  2. Renomeie anything.you.likeparaSourceCode.java

Na época em que usamos o Perforce, tínhamos exatamente esse problema e essa era a única solução que conseguimos encontrar.

ChrisF
fonte
13
Apenas uma nota para os outros: Não é necessário se comprometer no meio, mas é necessário adicionar o índice para git à mudança aviso
Arberg
29

As etapas a seguir permitiram alterar o caso no Windows:

  • Adicionar ignorecase = falseao [core]em .git/config;
  • Mova os arquivos que você irá renomear para fora do diretório do projeto;
  • Adicione as exclusões ao índice;
  • Mova todos os arquivos de volta ao seu local original e mude a caixa dos arquivos e / ou diretórios;
  • Adicione todos os arquivos "novos" ao índice;
  • Remova ignorecase = falseadicionado na primeira etapa.

Dessa forma, você tem um único commit que contém a renomeação e facilita a alteração, por exemplo, um diretório inteiro.

Pieter van Ginkel
fonte
5
Fazê-lo para banho configurações globais e locais: $ gti configuração --global core.ignorecase false $ gti configuração core.ignorecase falsa
Roman Ivanov
6

Seja cuidadoso. Fazer isso pode levar a alterações que são impossíveis de mesclar. O Git fica confuso ao mesclar no Windows porque não pode decidir se o nome antigo em maiúsculas e o novo nome em minúsculas são o mesmo arquivo ou não (para o Git eles não são, mas para o sistema de arquivos). Para mesclar, você precisa executar algumas soluções manuais, como excluir os arquivos antes de mesclar.

Consulte Problema de rebase do Git com arquivos com o mesmo nome, mas caso diferente

Não tenho certeza se esse problema é pior do que ter um arquivo com nome não convencional em seu projeto para todo o sempre, mas vale a pena saber se existem muitos usuários com muitos ramos que precisarão ser mesclados eventualmente.

jwg
fonte
Arquivos nomeados de forma não convencional em projetos de médio a grande porte devem sempre ser evitados, se possível, devido a problemas no desenvolvimento de várias plataformas (o atraso na correção de algo assim até mais tarde tornará os problemas da correção mais graves). Às vezes, você está desenvolvendo no Windows, mas também precisa fazer uma compilação do Linux, e uma inclusão que funcione bem no Windows faz com que a compilação seja interrompida no Linux.
Griffork 12/11/19
3

Na minha opinião, falta uma maneira simples. Você pode fazer isso para um único arquivo, um diretório específico ou mesmo todo o repositório:

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

Se você deseja afetar também os subdiretórios, use o -rsinalizador:

git rm -r --cached <directory>
git add <directory>
Nils-o-mat
fonte
Verdadeiramente o mais simples.
ranu 02/06
Isso perde todo o histórico do arquivo, pois é definido pelo git como um completamente novo.
Alejandro
@Alejandro O que você diz está errado. Acabei de testar e o git reconheceu a renomeação sem problemas. Como em outros casos, o arquivo é mostrado como removido / novo no índice, mas, ao confirmar, o git percebe que ele acabou de ser renomeado.
Nils-o-mat
1

Com o NTFS (ou FAT), um único git mvcomando não resolve o problema. Esta questão mostra uma técnica que funciona: git mv e apenas muda caso do diretório

Rainer Blome
fonte