Como mudar um submódulo git para apontar para uma subpasta?

101

Percorrendo o tutorial do SubModule , criei um submódulo fora do projeto boto . Então, descobri que, na verdade, preciso apenas de um subconjunto deste projeto - especificamente, a pasta boto .

Eu gostaria de mudar meu submódulo para apontar para esta pasta. Quando eu olho em módulos .git, eu vejo

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

Qual URL devo usar em vez de https://github.com/boto/boto.git ? Depois de alterar o URL, devo excluir a pasta boto localmente e puxar novamente?

ripper234
fonte
3
Não é exatamente o que você quer - não é um submódulo - mas você pode dar uma olhada emgit subtree
Cascabel
1
O que acabei fazendo é ter o submódulo inteiro e dizer ao IntelliJ que a pasta boto é uma 'pasta de origem', para que ele possa encontrar pacotes nela.
ripper234
15
Eu não posso acreditar que o git não faz isso nativamente ... caramba.
rogerdpack
2
Encontrada uma pergunta semelhante - stackoverflow.com/questions/1121227/…
sashoalm

Respostas:

65

Receio que a URL para submódulos sempre aponta apenas para o repositório - você não pode especificar que deseja apenas uma subpasta de um repositório, da mesma forma que o git não suporta "clones estreitos" em geral.

Se você não consegue conviver com o repositório inteiro como um submódulo, você sempre pode criar um novo repositório que é clonado do boto e, em seguida, configurar um cron job para:

  1. git fetch aquele repositório em um diretório
  2. Use git filter-branchpara atualizar uma ramificação em que o subdiretório está no nível superior.
  3. Adicione essa ramificação do repositório como o submódulo. No entanto, isso é um pouco complicado e minha preferência seria apenas conviver com o repositório inteiro como um submódulo.
Mark Longair
fonte
24

Você não pode clonar apenas uma parte de um repositório. Isso ocorre porque o git trata o repositório como um objeto inteiro: quando você o obtém, obtém tudo .

Portanto, a solução aqui seria buscar o submódulo em outro diretório e, em seguida, usar um link simbólico para atingir seu objetivo.

Artefacto2
fonte
Tenho links simbólicos no windows ... funciona bem também. (isso é por causa do msys que estou na minha máquina, então posso usar ln -scomo no Linux)
kumarharsh
7
Vista e & vêm com MKLink. Eu uso isso. howtogeek.com/howto/windows-vista/…
Angel S. Moreno
1
Em vez disso, você pode usar links
físicos
15

O que você quer fazer é criar um branch no submódulo e mover a pasta para cima e deletar o que você não precisa. Em vez disso, você pode gerenciar essa ramificação. Se você deseja enviar suas alterações, você deve ser capaz de voltar a mesclar primeiro. O Git saberá que você moveu os arquivos e fará a fusão com sucesso.

Espero que isto ajude.

Adam Dymitruk
fonte
O que é uma "fusão posterior"? Você pode dar um exemplo?
Sukima
uma fusão que vai "upstream" - de um branch de ordem superior para um de ordem inferior. Linus odeia isso. Eles estão vinculados à história de outros ramos que já podem ter sido fundidos.
Adam Dymitruk
Você poderia adicionar algum exemplo sobre "mesclagem reversa" nesta situação?
Xiao
Normalmente é quando você tenta manter seu branch de recurso atualizado ao mesclar coisas de um branch de linha principal, onde todos estão mesclando suas alterações mais recentes. Isso é ruim porque vincula seu ramo ao trabalho de outras pessoas. Se o produto requer seu branch, mas não um dos outros que já estão no branch de integração, não é possível.
Adam Dymitruk
ideia interessante, alguém já tentou isso? Vou tentar em breve, mas ainda não tenho certeza se "back merge" pode ser claro e automatizado ...
moudrick