Come cambiare un sottomodulo git in modo che punti a una sottocartella?


101

Sfogliando il tutorial modulo , ho creato un modulo di fuori del progetto di boto . Poi, ho scoperto che in realtà ho bisogno solo di un sottoinsieme di questo progetto, in particolare, la cartella boto .

Vorrei cambiare il mio sottomodulo in modo che punti a questa cartella. Quando guardo in .gitmodules, vedo

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

Quale URL dovrei usare al posto di https://github.com/boto/boto.git ? Dopo aver modificato l'URL, devo eliminare la cartella boto localmente e ri-tirare?


3
Non è esattamente quello che vuoi - non un sottomodulo - ma potresti dare un'occhiatagit subtree
Cascabel

1
Quello che ho finito per fare è avere l'intero sottomodulo e dire a IntelliJ che la cartella boto è una 'cartella sorgente', quindi può trovare i pacchetti al suo interno.
ripper234

15
Non riesco a credere che git non lo faccia in modo nativo ... accidenti.
rogerdpack

2
Abbiamo trovato una simile domanda - stackoverflow.com/questions/1121227/...
sashoalm

Risposte:


65

Temo che l'URL per i sottomoduli punti sempre e solo al repository - non puoi specificare che vuoi solo una sottocartella di un repository, allo stesso modo in cui git non supporta i "cloni stretti" in generale.

Se non riesci a convivere con l'intero repository come sottomodulo, puoi sempre creare un nuovo repository clonato da boto e quindi impostare un cron job per:

  1. git fetch quel repository in una directory
  2. Utilizzare git filter-branchper aggiornare un ramo in cui la sottodirectory è al livello superiore.
  3. Aggiungi quel ramo del repository come sottomodulo. Tuttavia, è tutto un po 'complicato e la mia preferenza sarebbe solo quella di convivere con l'intero repository come sottomodulo.

24

Non è possibile clonare solo una parte di un repository. Questo perché git tratta il repository come un intero oggetto: quando lo ottieni, ottieni tutto .

Quindi, la soluzione qui sarebbe recuperare il sottomodulo in un'altra directory, quindi utilizzare un collegamento simbolico per raggiungere il tuo obiettivo.


Ho collegamenti simbolici in Windows ... funziona anche bene. (è a causa di msys che ho sulla mia macchina, quindi posso usare ln -scome in Linux)
kumarharsh

7
Vista e vengono forniti con MKLink. Lo uso io. howtogeek.com/howto/windows-vista/…
Angel S. Moreno

1
Puoi invece utilizzare gli hard link
KindDragon

15

Quello che vuoi fare è creare un ramo nel sottomodulo e spostare la cartella verso l'alto ed eliminare ciò che non ti serve. Puoi quindi gestire quel ramo invece. Se desideri eseguire il push delle modifiche, dovresti prima essere in grado di eseguire l'unione di backup. Git saprà che hai spostato i file e farà l'unione con successo.

Spero che questo ti aiuti.


Cos'è un "back merge"? Puoi offrire un esempio?
Sukima

una fusione che va "a monte" - da un ramo di ordine superiore a uno di ordine inferiore. Linus li odia. Si legano alla storia da altri rami che potrebbero essere già stati fusi.
Adam Dymitruk

Potresti aggiungere qualche esempio sul "back merge" in questa situazione?
Xiao

In genere è quando si tenta di mantenere aggiornato il ramo delle funzionalità unendo elementi da un ramo della linea principale in cui tutti stanno unendo le ultime modifiche. Questo è negativo perché lega il tuo ramo al lavoro degli altri. Se il prodotto richiede il tuo ramo ma non uno degli altri già presenti nel ramo di integrazione, non è possibile.
Adam Dymitruk

idea interessante, qualcuno l'ha provato? Proverò presto, ma ancora non sono sicuro che "back merge" possa essere chiaro e automatizzato ...
moudrick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.