Come posso clonare una sottocartella di un repository in Mercurial?

Ho un repository Mercurial contenente una manciata di progetti correlati. Voglio ramificare solo uno di questi progetti per lavorarci altrove.

La clonazione è ansible solo in parte di un repository ed è questo il modo giusto per raggiungere questo objective?

Quello che vuoi è un clone stretto o parziale , ma sfortunatamente non è ancora supportato.

Se hai già un grande repository e ti rendi conto che avrebbe senso dividerlo in diversi repository più piccoli, puoi usare l’ estensione convert per eseguire una conversione da Mercurial a Mercurial . Nota che questo crea un nuovo repository foo e non puoi spingere / tirare tra your-big-repo e foo .

L’ convert extension non è abilitata di default, quindi aggiungi quanto segue al file hgrc del tuo repository o al tuo file mercurial.ini :

 [extensions] hgext.convert= 

Quindi creare un file map.txt con

 include "libs/foo" rename "libs/foo" . 

(nota che puoi usare le barre in avanti anche su Windows) ed esegui

 $ hg convert --filemap map.txt your-big-repo foo 

Questo renderà foo un repository con la cronologia completa della cartella libs/foo da your-big-repo .

Se vuoi eliminare tutte le prove di foo dal your-big-repo puoi effettuare un’altra conversione dove usi exclude libs/foo di exclude libs/foo per sbarazzarti della directory.

Quando hai diversi repository come questo e vuoi usarli nel loro complesso, allora dovresti guardare i sottoregisti . Questa funzione ti consente di includere altri repository in un checkout, analogamente a come svn:externals funzionano. Si prega di seguire le raccomandazioni su quella pagina wiki.

Invece di fare un clone parziale, è ansible utilizzare Converti estensione per dividere il repository in più di un repository tramite il repository secondario.

In particolare, consultare la sezione Conversione da Mercurial :

È anche utile filtrare i repository Mercurial per ottenere sottoinsiemi di uno esistente. Ad esempio, per trasformare una sottodirectory subfoo di un repository foo in un repository con la propria vita (mantenendo la cronologia completa), effettuare le seguenti operazioni:

 $ echo include subfoo > /tmp/myfilemap $ echo rename subfoo . >> /tmp/myfilemap $ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo 

Sono incappato in questo problema e ho trovato un modo per farlo: usare i collegamenti simbolici (solo Linux purtroppo)

Ad esempio, se hai solo bisogno di /project nel repository, sul tuo computer clonare il repository in un’altra cartella, quindi usare ln -s /repo/location/ project . Mercurial lo gestirà

Non è ansible, hg clone clonerà l’intero repository.

Puoi dare un’occhiata all’estensione del sub-repository che ti permette di avere repository all’interno di un repository, che potrebbe corrispondere alle tue esigenze.

(Fine 2016) Mainline Mercurial continua a non supportare il pacchetto per “cloni stretti”, ma esistono estensioni di terze parti che affrontano il problema in modi diversi.

Se riesci a far fronte a un checkout ristretto (ovvero “checkout sparse” o “checkout parziale per percorso file”), l’estensione sparse.py di Facebook dal repository hg-experimental (guarda all’interno della directory hgext3rd/ ) può essere praticabile. In questo scenario, si clona comunque la cronologia completa (quindi la directory .hg non è più piccola) ma la directory di lavoro mostra / agisce solo su un sottoinsieme del repository completo.

In alternativa, Google ha creato un’estensione NarrowHG che esegue la clonazione ristretta (ovvero “clonazione parziale per percorso file”). Dovrai avere il controllo del server, del client ed essere disposto a utilizzare le funzionalità sperimentali, ma in realtà limita la cronologia copiata del clone in .hg a un sottoinsieme di ciò che era nel repository originale.

Questo è semplice con l’ estensione Convert .