Posso spostare la directory .git per un repository nella directory principale?
-
03-07-2019 - |
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.
Soluzione
Puoi fare ciò che stai descrivendo in questo modo:
-
Sposta il contenuto di
ABC
in una sottodirectoryABC /
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
-
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
-
Infine, crea il repository
PPP
e inserisci siaABC
cheDEF
:$ 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
ePPP / 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.