Renomear um submódulo git

155

Existe alguma maneira fácil de renomear um diretório de sub-módulo git (além de passar por todo o movimento de excluí- lo e adicioná-lo novamente com um novo nome de destino).

E enquanto estamos nisso, por que simplesmente não posso fazer o seguinte no diretório pai: git mv old-submodule-name new-submodule-name

Lars Tackmann
fonte
6
Você não precisará mais atualizar .gitmodulesmanualmente ao mover um submódulo. veja minha resposta abaixo
VonC
A resposta de @ VonC funcionou como um encanto para mim
laconbass
Os módulos Git são muito complicados. npmmostra como funciona simples. Um dia ... talvez ... alguém ... o reescreva ... enquanto isso ...
Rolf
A resposta do @ VonC não é a história completa de hoje: ele realmente mudará .gitmodules, mas apenas renomeará o caminho, não o nome do módulo. Você precisa de uma edição adicional para .gitmodules para corrigir isso e um 'git submódulo sync' para concluir o processo completo
zertyz
@zertyz: A propriedade [submodule "name_of_submodule"] é um nome interno do Git, você pode renomeá-lo para não se confundir, mas é apenas um rótulo.
MKesper 16/05/19

Respostas:

101

Eu encontrei o seguinte fluxo de trabalho funcionando:

  • Atualizar .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Nota: essa abordagem não atualiza o índice e os módulos .git corretamente nas versões 2018 do GIT.

Nota: Você pode ser capaz de agora apenas fazer git mv oldpath newpathagora, como fora apontado em VonC 's resposta . (Verifique se você está usando a versão mais recente do git)

Mariusz Nowak
fonte
22
note to self: para git add newpathnão usar uma barra final
atomicules
10
Com esse fluxo de trabalho, você criará apenas um link simbólico para o subdiretório usado como submódulo. O link simbólico é apenas uma parte da funcionalidade global do submódulo. Isso significa que, quando você clona o repositório que usa os submódulos renomeados, pode terminar com o seguinte erro: Nenhum mapeamento de submódulo encontrado em .gitmodules para o caminho 'your-oldpath' Depois de remover o caminho antigo (* git rm oldpath ), você deve use o submodule git add newpath do REPO-URL em vez de "git add newpath *. Quando concluído, o status do git exibirá algo assim: renomeado: oldpath -> newpath
Bertrand
5
Essas soluções não funcionam para mim porque, ao usar o comando git add, o submódulo foi incluído no projeto como um diretório simples e não como um submódulo. tente $ mv submodule-oldpath ~ / outro local $ git rm submodule-oldpath $ git submódulo add submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adam
3
Se você tiver algum problema com a árvore de trabalho, também poderá editar o .git/modules/SUBMODULE/configarquivo, de modo que worktreeaponte para o diretório certo novamente.
Vincent Ketelaars
3
Isso não funcionou para mim com o git 2.13.1. Mas simplesmente fazer git mv old newfunciona como um encanto. Eu só preciso fazer o git commit para concluir as alterações.
usuário
225

Git1.8.5 (outubro de 2013) deve simplificar o processo . Basta fazer um:

git mv A B

" git mv A B", ao mover um submódulo A, foi ensinado a realocar sua árvore de trabalho e ajustar os caminhos no .gitmodulesarquivo .


Veja mais em commit 0656781fadca1 :

Atualmente, usar " git mv" em um submódulo move a árvore de trabalho do submódulo na do superprojeto. Mas a configuração do caminho do submódulo .gitmodulesé deixada intocada, que agora é inconsistente com a árvore de trabalho e faz com que os comandos git que dependem do comportamento adequado path -> name mapping(como statuse diff) se comportem estranhamente.

git mvAjude aqui " " não apenas movendo a árvore de trabalho do submódulo, mas também " submodule.<submodule name>.path" atualizando a configuração do .gitmodulesarquivo e preparando ambos.
Isso não acontece quando nenhum .gitmodulesarquivo é encontrado e apenas emite um aviso quando não há uma seção para este submódulo. Isso ocorre porque o usuário pode apenas usar gitlinks simples sem o .gitmodulesarquivo ou já atualizou a configuração do caminho manualmente antes de emitir o comando "git mv" (nesse caso, o aviso lembra que isso mvseria feito por ele).
Somente quando .gitmodulesfor encontrado e contiver conflitos de mesclagem, o mvcomando falhará e solicitará ao usuário que resolva o conflito antes de tentar novamente.


O git 2.9 (junho de 2016) será aprimorado git mvpara o submódulo:

Veja commit a127331 (19 de abril de 2016) por Stefan Beller ( stefanbeller) .
(Mesclado por Junio ​​C Hamano - gitster- no commit 9cb50a3 , 29 de abril de 2016)

mv: permite mover submódulos aninhados

" git mv old new" não ajustou o caminho para um submódulo que vive como um subdiretório dentro do old/diretório corretamente.

Entretanto, os submódulos precisam atualizar seus links para o diretório git, bem como atualizações para o .gitmodulesarquivo.

VonC
fonte
Nota para si mesmo: tente isso no 1.8.4 e você terá fatal: source directory is empty, source=my_source, destination=my_destination. Tentará novamente quando o 1.8.5 tiver uma versão estável.
soma de verificação
@checksum Mas o 1.8.5 tem uma versão estável, por pelo menos algumas ... horas;) github.com/git/git/releases/tag/v1.8.5
VonC
Eu tive que construir o Git versão 1.8.5.GIT a partir do código fonte, porque existe o Git v.1.7.5 nos repositórios do Ubuntu. Como criar o Git a partir do código-fonte
Maksim Dmitriev
2
@MaksimDmitriev, mas e um ppa (Personal Package Archive) mencionado em stackoverflow.com/a/20918469/6309 ?
VonC
1
O git mv simplesmente não funciona para esse propósito em minha máquina.
Alexander Dyagilev
11

Eu apenas tentei algumas das sugestões acima. Estou correndo:

$ git --version
git version 1.8.4

Eu achei que era melhor reiniciar o submódulo, remover o diretório e criar um novo submódulo.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Pelo menos é o que funcionou melhor para mim. YMMV!

jaredwolff
fonte
7

Não é possível renomeá-lo, então você deve removê-lo primeiro ( deinit) e adicioná-lo novamente.

Então, depois de removê-lo:

git submodule deinit <path>
git rm --cached <path>

você também pode verificar e remover as referências a ele em:

  • .gitmodules
  • .git/config
  • remova a pasta de referência de .git/modules/<name>(melhor para fazer um backup), pois cada pasta possui um configarquivo onde mantém a referência à suaworktree

depois, prepare suas alterações, enviando alterações ao seu repo:

git commit -am 'Removing submodule.'

e verifique se não há problemas pendentes:

git submodule update
git submodule sync
git submodule status

então agora você pode adicionar o submódulo git novamente:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
kenorb
fonte
também é hoje
Alexey
O título das perguntas é um nome impróprio, pertence ao caminho, não ao nome
Max Robbertze
3

Edite o arquivo .gitmodules para renomear o submódulo e, em seguida, renomeie o diretório do submódulo.

Acho que você pode precisar fazer isso git submodule syncdepois, mas não estou em posição de verificar agora.

Abizern
fonte
Isso faz com que o novo nome do sub-módulo ocorra como uma nova confirmação e não como uma renomeação. Mas talvez seja assim que deve ser?
Lars Tackmann
1
@ Lars: Certifique-se de remover também o diretório antigo do submódulo!
Cascabel
3

MacOs : Quando eu quero usar a solução VonC para alterar a pasta do submódulo Commonpara minúscula:

git mv Common common

eu recebo

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

Solução - use um nome de pasta temporário e mova duas vezes:

git mv Common commontemp
git mv commontemp common

Isso é tudo :)

Kamil Kiełczewski
fonte