Puis-je déplacer le répertoire .git d'un référentiel vers son répertoire parent?
-
03-07-2019 - |
Question
J'ai deux sous-répertoires avec chacun un rapport, donc:
PPP/
|--ABC/
| |--.git/
| |--AAA/
| | BBB/
| | CCC/
|
|--DEF/
| |--.git/
| |--DDD/
| |--EEE/
Et voudriez les combiner dans un même dépôt, alors je suppose que la structure de répertoire ressemblerait à ceci:
PPP/
|--.git/
|--ABC/
| |--AAA/
| |--BBB/
| |--CCC/
|
|--DEF/
| |--DDD/
| |--EEE/
Est-ce possible?
De plus, à l’heure actuelle, plusieurs personnes ont des pensions sur leurs machines. Combien plus compliqué cela rend-il la vie?
Ta.
La solution
Vous pouvez faire ce que vous décrivez comme ceci:
-
Déplacez le contenu de
ABC
dans un sous-répertoireABC /
et corrigez l'historique afin qu'il ressemble à ce qu'il a toujours été 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
Votre structure de répertoire est maintenant
ABC / ABC / votre_code
-
Idem pour le contenu de
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
Votre structure de répertoire est maintenant
DEF / DEF / votre_code
-
Enfin, créez le référentiel
PPP
et insérez-y les codesABC
etDEF
:$ mkdir /path/to/PPP $ cd /path/to/PPP $ git init $ git pull /path/to/ABC $ git pull /path/to/DEF
Vous avez maintenant
PPP / ABC / your_code
etPPP / DEF / your_code
, ainsi que tout l'historique.
Vous devriez probablement demander à vos collègues d'exécuter les commandes précédentes sur leur système, afin que tout le monde soit synchronisé.
Remarque: les commandes géniales
de branche-filtre
provient de la page de manuel . : -)
Autres conseils
Avez-vous vraiment besoin de fusionner les deux référentiels existants dans un référentiel ou souhaitez-vous simplement les regrouper?
Si vous voulez juste les grouper, alors git-submodule fera ce que vous voulez: vous allez vous retrouver avec trois référentiels où le premier niveau est lié aux deux actuels.
À titre indicatif:
-
Vous devez les fusionner dans un seul référentiel si vous souhaitez augmenter le couplage entre eux, de sorte qu'il ne soit plus logique d'utiliser une version du référentiel A avec une version différente du référentiel B.
-
Vous devez utiliser des sous-modules s'ils restent un peu séparés (il est parfois logique de travailler sur un seul module), mais vous souhaitez pouvoir les utiliser ensemble (par exemple, téléchargez les deux à la fois, contrôlez connu-bon état à la fois, etc.).
L'utilisation de sous-modules évitera les problèmes liés aux copies existantes des référentiels, car l'historique ne change pas. Leur fusion créera une nouvelle histoire et il sera plus difficile pour les personnes travaillant dans les branches existantes de fusionner leurs changements.
Pour moi, il semble difficile de faire ce que vous voulez, car l'historique des deux projets ne se confondra pas.
Mon meilleur conseil serait de créer un nouveau référentiel pour contenir ABC et DEF, en conservant l'ancien référentiel pour sauvegarder l'historique et commencer un nouvel historique avec ce nouveau projet.