Gostaria de alterar o nome do diretório de um sub-módulo Git no meu superprojeto Git.
Vamos supor que eu tenha a seguinte entrada no meu .gitmodules
arquivo:
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
O que eu tenho que digitar para mover o .emacs.d/vimpulse
diretório .emacs.d/vendor/vimpulse
sem excluí-lo primeiro (explicado
aqui e aqui ) e depois adicioná-lo novamente.
O Git realmente precisa de todo o caminho na tag submodule
[submodule ".emacs.d/vimpulse"]
ou também é possível armazenar apenas o nome do subprojeto?
[submodule "vimpulse"]
git
git-submodules
thisch
fonte
fonte
git mv
comando, diretamente na pergunta.git mv
assim. Usedeinit
entãorm
como stackoverflow.com/a/18892438/8047 especificado .git mv
funciona para sub-módulos, sem necessidade de mais nada.1.8.5
sub-módulos móveis são suportados nativamente usando ogit mv
comando ( nas notas de versão , primeiro vinculadas pelo próprio @thisch). Também respondeu aquigit mv
move o submódulo na área de trabalho e atualiza os arquivos .git do submódulo corretamente, mas a subpasta dentro da pasta .git / modules do repositório pai permanece a mesma - tudo bem? (Estou usando o git 2.19.0 no Windows)Respostas:
Nota: Conforme mencionado nos comentários, esta resposta se refere às etapas necessárias nas versões mais antigas do git. O Git agora tem suporte nativo para mover submódulos:
O processo é semelhante a como você removeria um submódulo (consulte Como removo um submódulo? ):
.gitmodules
e altere o caminho do submódulo adequadamente e coloque-o no índice comgit add .gitmodules
.mkdir -p new/parent
).mv -vi old/parent/submodule new/parent/submodule
).git add new/parent
).git rm --cached old/parent/submodule
..git/modules/old/parent/submodule
com todo o seu conteúdo para.git/modules/new/parent/submodule
..git/modules/new/parent/config
arquivo, verifique se o item da árvore de trabalho aponta para os novos locais, portanto, neste exemplo deve serworktree = ../../../../../new/parent/module
. Normalmente, deve haver mais de dois..
diretórios no caminho direto nesse local.Edite o arquivo
new/parent/module/.git
, verifique se o caminho aponta para o novo local correto dentro da.git
pasta principal do projeto , neste exemplogitdir: ../../../.git/modules/new/parent/submodule
.git status
saída fica assim para mim depois:Por fim, confirme as alterações.
fonte
path
configuração e o nome do sub-módulo. Por exemplo, ao mover foo / module para bar / module, você deve alterar em .gitmodules a seção[submodule "foo/module"]
para[submodule "bar/module"]
e, na mesma seção,path = foo/module
parapath = bar/module
. Além disso, você deve alterar em .git / config a seção[submodule "foo/module"]
para[submodule "bar/module"]
.fatal: 'git status --porcelain' failed in...
simplesmente excluir quaisquer arquivos ou diretórios .git no submódulo..git/modules/old/parent/submodule
, movê-lo para o novo local, atualizargitdir
emold/parent/submodule/.git
...git mv old/submod new/submod
funciona como esperado e faz todo o encanamento para você. Você provavelmente deseja usar o git 1.9.3+ porque inclui correções para a movimentação do submódulo.A resposta mais moderna, tirada do comentário de Valloric acima:
git mv old/submod new/submod
git status
.)git commit
e pronto!Feito!
fonte
1.9.3
exceção de um submódulo dentro do submódulo movido. Isso precisava de alguma limpeza manual.1.8.5
conforme descrito nas notas de versão ..gitmodules
arquivo, eleold/submod
ainda será usado como o rótulo para o submódulo enquanto o caminho foi alterado. Para alterar o rótulo também, parece que você precisa realmente mover o caminho do diretório de módulos para dentro.git
e, em seguida, alterar manualmente o rótulo.gitmodules
.No meu caso, eu queria mover um sub-módulo de um diretório para um subdiretório, por exemplo, "AFNetworking" -> "ext / AFNetworking". Estes são os passos que segui:
[core] worktree
linha. Mina alterada de../../../AFNetworking
para../../../../ext/AFNetworking
gitdir
. Mina alterada de../.git/modules/AFNetworking
para../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
Por fim, vi no status git:
Et voila. O exemplo acima não altera a profundidade do diretório, o que faz uma grande diferença na complexidade da tarefa e não altera o nome do submódulo (o que pode não ser realmente necessário, mas eu fiz isso para ser consistente com o que aconteceria se eu adicionasse um novo módulo nesse caminho.)
fonte
[Atualização: 26/11/2014] Como Yar resume bem abaixo, antes de fazer qualquer coisa, verifique o URL do submódulo. Se desconhecido, abra
.git/.gitmodules
e examine a chavesubmodule.<name>.url
.O que funcionou para mim foi remover o antigo submódulo usando
git submodule deinit <submodule>
seguido porgit rm <submodule-folder>
. Em seguida, adicione o submódulo novamente com o novo nome da pasta e confirme. A verificação do status do git antes da confirmação mostra o antigo submódulo renomeado para o novo nome e o .gitmodule modificado.fonte
O truque parece entender que o
.git
diretório para submódulos agora é mantido no repositório principal, abaixo.git/modules
, e cada submódulo possui um.git
arquivo que aponta para ele. Este é o procedimento que você precisa agora:.git
arquivo no diretório de trabalho do submódulo e modifique o caminho que ele contém para que aponte para o diretório correto no diretório do repositório principal.git/modules
..git/modules
diretório do repositório principal e localize o diretório correspondente ao seu submódulo.config
arquivo, atualizando oworktree
caminho para que ele aponte para o novo local do diretório de trabalho do submódulo..gitmodules
arquivo na raiz do repositório principal, atualizando o caminho para o diretório de trabalho do submódulo.git add -u
git add <parent-of-new-submodule-directory>
(É importante que você adicione o pai , e não o diretório do submodule.)Algumas notas:
[submodule "submodule-name"]
linhas.gitmodules
e.git/config
devem coincidir, mas não correspondem a mais nada..git
diretório do submódulo devem apontar corretamente um para o outro..gitmodules
e.git/config
devem ser sincronizados.fonte
A sequência entre aspas após "[submódulo" não importa. Você pode alterá-lo para "foobar", se quiser. É usado para encontrar a entrada correspondente em ".git / config".
Portanto, se você fizer a alteração antes de executar o "git submodule init", funcionará bem. Se você fizer a alteração (ou capturá-la através de uma mesclagem), será necessário editar manualmente .git / config ou executar "git submodule init" novamente. Se você fizer o último, ficará com uma entrada "inativa" inofensiva com o nome antigo em .git / config.
fonte
git submodule sync
propaga a alteração para.git/config
automaticamenteVocê pode simplesmente adicionar um novo submódulo e remover o submódulo antigo usando comandos padrão. (deve evitar erros acidentais dentro do .git)
Exemplo de configuração:
Examine a movimentação 'jquery' para 'vendor / jquery / jquery':
Método de bônus para submódulos grandes:
Se o submódulo for grande e você preferir não esperar o clone, poderá criar o novo submódulo usando o antigo como origem e, em seguida, alternar a origem.
Exemplo (use o mesmo exemplo de configuração)
fonte
newPath
.A solução fornecida não funcionou para mim, no entanto, uma versão semelhante funcionou ...
Isso ocorre com um repositório clonado, portanto, o submodule git repos está contido no repositório superior .git dir. Todos os cátions são do repositório superior:
Edite .gitmodules e altere a configuração "path =" para o submódulo em questão. (Não é necessário alterar o rótulo nem adicionar esse arquivo ao índice.)
Edite .git / modules / name / config e altere a configuração "worktree =" para o submódulo em questão
corre:
Gostaria de saber se faz diferença se os repositórios são atômicos ou submódulos relativos, no meu caso, foi relativo (submódulo / .git é uma ref voltar ao topproject / .git / modules / submódulo)
fonte
Basta usar o script de shell git-submodule-move .
fonte
Eu acabei de passar por essa provação ontem e essa resposta funcionou perfeitamente. Aqui estão os meus passos, para maior clareza:
more .gitmodules
porque, quando você excluir o submódulo, ele não estará disponíveldeinit
,rm
e depoissubmodule add
EXEMPLO
COMANDOS
NOTA: O git mv não faz isso. Em absoluto.
fonte
git mv
deve ser melhor nas últimas versões do Git.mv
. Obrigado!