Em um repositório Git, como renomear corretamente um diretório?

655

Eu acho que deve funcionar para copiar o diretório para ser renomeado para um novo diretório com o nome desejado, e excluir o diretório de idade , e git add, git commite pushtudo. Mas esse é o melhor caminho?

qazwsx
fonte
1
Duplicado possível: Como saber Git que é o mesmo diretório, apenas um nome diferente
Christopher Peisert
5
No que diz respeito ao Git, copiar e excluir é a mesma coisa que mover. O Git gravará (copiar + excluir) e (mover) da mesma maneira.
precisa

Respostas:

1183

Renomear básico (ou mover):

git mv <old name> <new name>

Renomear maiúsculas de minúsculas - por exemplo. de casesensitivepara CaseSensitive- você deve usar duas etapas:

git mv casesensitive tmp
git mv tmp CaseSensitive

( Mais sobre a distinção entre maiúsculas e minúsculas no Git… )

… Seguido de commit e push seria a maneira mais simples de renomear um diretório em um repositório git.

CB Bailey
fonte
231
Mas se você deseja renomear casesensitivea CaseSensitive, você pode fazer desta forma: git mv casesensitive Tempe depois git mv Temp CaseSensitive
ViliusK
3
Ele salva todo o log e estatísticas?
Orezvani 26/05
23
@ViliusK se você está lidando com diretórios sensíveis caso alguma maneira fácil que eu encontrei é git rm -rf --cached path/to/your/directoriesentão re-add e comprometer
dtothefp
1
Mas por que o GIT não tem um suporte adequado para alteração de nome em um pacote / diretório? Por que eu preciso criar uma pasta separada? Quando altero um nome do pacote, ele não deve ser considerado uma diferença e cuidar dele no momento do commit & push?
Ahmed
1
Muito obrigado por isso. Para mim, eu tive que executar primeiro git config core.ignorecase falsee depois executar os comandos em sucessão, ou então, na segunda parte, eu receberia um source is emptyerro.
Rika
107

Se você receber este erro: fatal: renomear 'foldername' falhou: argumento inválido

Tente o seguinte:

git mv foldername tempname && git mv tempname folderName

Jacques Betancourt
fonte
8
Isso é exatamente o que eu precisava para fazer uma alteração de caso em um diretório.
Csserio
O token '&&' não é um separador de instrução válido nesta versão. git versão 2.11.0.windows.
Tim Hardy
@ Tim Hardy também pode ser executado como dois comandos separados git mv foldername tempnamee git mv tempname folderName, que devem funcionar no Windows.
Larkeith 28/10/19
isso não funciona ! o resultado final vai colocar nova pasta 'folderName' dentro do 'tempname' pasta
aposta
61

1. Altere o nome de uma pasta de pasta antiga para nova pasta

git mv oldfolder newfolder

2. Se a nova pasta já estiver no seu repositório e você quiser substituí-la e usar: - force

git mv -f oldfolder newfolder

Não se esqueça de adicionar as alterações ao índice e enviá-las após renomear com git mv.

3. Renomeando o nome da pasta para folderName em sistemas de arquivos que não diferenciam maiúsculas de minúsculas

Renomear simples com um comando mv normal (não git mv) não será reconhecido como uma troca de arquivos do git. Se você tentar com o comando 'git mv' como na linha a seguir

git mv foldername folderName

Se você estiver usando um sistema de arquivos que não diferencia maiúsculas de minúsculas, por exemplo, você está em um Mac e não o configurou para diferenciar maiúsculas de minúsculas, você receberá uma mensagem de erro como esta:

fatal: falha ao renomear 'foldername': argumento inválido

E aqui está o que você pode fazer para fazê-lo funcionar: -

git mv foldername tempname && git mv tempname folderName

Isso divide o processo de renomeação, renomeando a pasta primeiro para um nome de pasta completamente diferente. Depois de renomeá-lo para o nome da pasta diferente, a pasta pode finalmente ser renomeada para o novo nome da pasta. Depois desses 'git mv', novamente, não se esqueça de adicionar e confirmar as alterações. Embora essa provavelmente não seja uma técnica bonita, ela funciona perfeitamente bem. O sistema de arquivos ainda não reconhecerá uma alteração nas maiúsculas e minúsculas, mas o git deve renomeá-lo para um novo nome de pasta, e é isso que queríamos :)

akshay_rahar
fonte
9

Você pode renomear o diretório usando o sistema de arquivos. Então você pode fazer git rm <old directory>e git add <new directory>( página de Ajuda ). Então você pode confirmar e empurrar.

O Git detectará que o conteúdo é o mesmo e que é apenas uma operação de renomeação e aparecerá como uma entrada de renomeação no histórico. Você pode verificar se esse é o caso antes da confirmação usandogit status

Oleksi
fonte
12
ei, mas dessa maneira, perderei todo o histórico de commit.
ViliusK
1
Você pode retê-lo se usar o sinalizador -follow.
Oleksi
Dois comandos em vez de um, e ter que adicionar um sinalizador? Isso é melhor do que o git mv?
Antgel
4
@topper Não, o git mv é apenas um alias para o rm + add. Usar o git mv é uma solução melhor.
Oleksi
5
@topper Observe que você ainda precisará usar --follow para visualizar o histórico, independentemente do método usado para mover o arquivo.
Oleksi
3

No aplicativo da Web, acho que você não pode, mas pode renomear todas as pastas no Git Client; ele moverá seus arquivos para as novas pastas renomeadas, do que confirmar e enviar para o repositório remoto.

Eu tive um problema muito parecido: tive que renomear pastas diferentes, de maiúsculas para minúsculas (como Abc -> abc), renomeei todas as pastas com um nome falso (como 'abc___') e comprometido com o repositório remoto, depois que renomeei todas as pastas para o nome original com letras minúsculas (como abc) e as levou!

Syncro
fonte
0

Eu o resolvi em duas etapas. Para renomear a pasta usando o comando mv, você precisa de direitos para isso, se não tiver o direito, poderá seguir estas etapas. Suponha que você queira renomear maiúsculas e minúsculas para maiúsculas e minúsculas.

Etapa 1: renomeie a pasta (sensível a maiúsculas e minúsculas) para outra coisa do explorer. Por exemplo, renomeie maiúsculas de minúsculas para folder1 e confirme essa alteração.

Etapa 2: renomeie esta pasta recém nomeada (folder1) para o nome sensível a maiúsculas e minúsculas esperado (sensível a maiúsculas e minúsculas), por exemplo. Renomeie a pasta1 para Diferenciar maiúsculas de minúsculas. Confirme essa alteração.

Nilesh
fonte
0

Para renomear maiúsculas de minúsculas, git mv somefolder someFolderjá funcionou para mim antes, mas não hoje por algum motivo. Então, como solução alternativa, criei uma nova pasta temp, movi todo o conteúdo de somefolderpara temp, excluí somefolder, comprometi o e temp, em seguida someFolder, criei , movi todo o conteúdo de temppara someFolder, excluído temp, confirmado e enviado por push someFoldere funcionou! Aparece como someFolderno git.

Ryan Walker
fonte
-16

Simplesmente renomeie a pasta. O git é um "rastreador de conteúdo"; portanto, os hashes SHA1 são os mesmos e o git sabe que você o renomeou. A única coisa que muda é o objeto de árvore.

rm <directory>
git add .
git commit
bitwave
fonte
1
Isso nem sempre funciona. Certamente não funcionou para mim por sth. como 20% arquivos ...
Tomáš Fejfar