Domanda

Ho due sottodirectory ognuna con un repository, quindi:

PPP/
 |--ABC/
 |   |--.git/
 |   |--AAA/
 |   |    BBB/
 |   |   CCC/
 |   
 |--DEF/
 |   |--.git/
 |   |--DDD/
 |   |--EEE/

E vorrei combinarli in un unico repository, quindi, suppongo che la struttura delle directory sarebbe così:

PPP/
 |--.git/
 |--ABC/
 |   |--AAA/
 |   |--BBB/
 |   |--CCC/
 |   
 |--DEF/
 |   |--DDD/
 |   |--EEE/

È possibile?

Inoltre attualmente diverse persone hanno i repository sui loro computer. Quanto più complicato rende la vita?

Ta.

È stato utile?

Soluzione

Puoi fare ciò che stai descrivendo in questo modo:

  1. Sposta il contenuto di ABC in una sottodirectory ABC / e correggi la cronologia in modo che sembri che sia sempre stata lì:

    $ cd /path/to/ABC
    $ git filter-branch --index-filter \
        'git ls-files -s | sed "s-\t-&ABC/-" |
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
         git update-index --index-info &&
         mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
    

    Ora la tua struttura di directory è ABC/ABC/your_code

  2. Lo stesso vale per il contenuto di DEF :

    $ cd /path/to/DEF
    $ git filter-branch --index-filter \
        'git ls-files -s | sed "s-\t-&DEF/-" |
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
         git update-index --index-info &&
         mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
    

    Ora la tua struttura di directory è DEF/DEF/your_code

  3. Infine, crea il repository PPP e inserisci sia ABC che DEF :

    $ mkdir /path/to/PPP
    $ cd /path/to/PPP
    $ git init
    $ git pull /path/to/ABC
    $ git pull /path/to/DEF
    

    Ora hai PPP / ABC / your_code e PPP / DEF / your_code , insieme a tutta la cronologia.

Probabilmente dovresti chiedere ai tuoi colleghi di eseguire i comandi precedenti sul loro sistema, in modo che tutti possano essere sincronizzati.

  

Nota: il funky filtro-ramo comanda provengono dalla pagina man . : -)

Altri suggerimenti

Hai davvero bisogno di unire i due repository esistenti in un unico repository o vuoi semplicemente raggrupparli?

Se vuoi solo raggrupparli, allora git-submodule farà quello che vuoi: finirai con tre repository in cui quello di primo livello si collega ai due attuali.

Come guida:

  • È necessario unirli in un singolo repository se si intende aumentare l'accoppiamento tra loro in modo che non abbia più senso utilizzare una versione del repository A con una versione diversa del repository B.

  • Dovresti usare i sottomoduli se rimangono in qualche modo separati (a volte ha senso lavorare su uno in isolamento), ma vuoi la comodità di poter lavorare con loro insieme (ad es. scarica entrambi contemporaneamente, checkpoint stati noti attraverso entrambi, ecc.)

L'uso dei sottomoduli eviterà problemi con le copie esistenti dei repository, poiché la cronologia non cambia. La loro fusione creerà una nuova storia e sarà più difficile per le persone che lavorano dalle filiali esistenti unire i loro cambiamenti.

Per me sembra difficile fare come lo desideri perché la storia di entrambi i progetti non si fonderà.

Il mio miglior consiglio sarebbe quello di creare un nuovo repository per contenere ABC e DEF, mantenendo vecchi repository da questi due per avere il backup della cronologia e iniziare una nuova storia con questo nuovo progetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top