J'ai deux projets SVN en cours d'utilisation depuis un autre référentiel SVN avec svn: externals .
Comment puis-je avoir la même structure de présentation de référentiel dans Git?
Git a deux approches similaires, mais pas exactement équivalentes à svn: externals:
Subtree fusionne insère le code du projet externe dans un sous-répertoire distinct de votre référentiel. Ceci a un processus détaillé à configurer et est ensuite très facile pour les autres utilisateurs, car il est automatiquement inclus lorsque le référentiel est extrait ou cloné. Cela peut être un moyen pratique d’inclure une dépendance dans votre projet.
Il est facile d'extraire les modifications de l'autre projet mais compliqué de les soumettre. Et si l'autre projet doit fusionner à partir de votre code, l'historique des projets est fusionné et les deux projets ne font plus qu'un.
Git submodules ( manual ) un lien vers un commit spécifique dans le référentiel d'un autre projet, un peu comme svn: externals avec un argument -r
. Les sous-modules sont faciles à configurer, mais tous les utilisateurs doivent gérer les sous-modules, qui ne sont pas automatiquement inclus dans les extractions (ou les clones).
Bien qu'il soit facile de soumettre les modifications à l'autre projet, cela peut poser des problèmes si le référentiel a changé. Par conséquent, il n'est généralement pas approprié de soumettre les modifications à un projet en cours de développement.
Comme je l’ai mentionné dans " Mise à jour de la nouvelle version du sous-module Git ", vous pouvez obtenir même fonctionnalité externe SVN avec les sous-modules Git 1.8.2:
git config -f .gitmodules submodule.<path>.branch <branch>
Cela suffit pour qu'un sous-module suive une branche (comme dans le LATEST commit d'une branche distante d'un sous-module rapport amont ). Tout ce que vous devez faire est un:
git submodule update --remote
Cela mettra à jour le sous-module.
Plus de détails se trouvent dans " git submodule
tracking latest ".
Pour convertir un sous-module existant en un suivi d'une branche: Voir toutes les étapes dans " Sous-modules Git: Spécifiez une branche/balise ".
J'ai une solution alternative au problème - outil gil (git links)
Il permet de décrire et de gérer des dépendances complexes de référentiels git.
En outre, il fournit une solution au problème de dépendance des sous-modules récursifs git .
Considérez que vous avez les dépendances de projet suivantes: exemple de graphe de dépendance du référentiel git
Vous pouvez ensuite définir le fichier .gitlinks
avec la description de la relation de référentiels:
# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master
# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master
# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master
Chaque ligne décrit le lien git au format suivant:
Enfin, vous devez mettre à jour votre exemple de référentiel racine:
# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link
# The same result with a single command
gil update
Le résultat est de cloner tous les projets requis et de les lier les uns aux autres de manière appropriée.
Si vous souhaitez valider toutes les modifications dans un référentiel avec toutes les modifications dans les référentiels liés aux enfants, vous pouvez le faire avec une seule commande:
gil commit -a -m "Some big update"
Les commandes Pull, Push fonctionnent de la même manière:
gil pull
gil Push
Gil (liens git) supporte les commandes suivantes:
usage: gil command arguments
Supported commands:
help - show this help
context - command will show the current git link context of the current directory
clone - clone all repositories that are missed in the current context
link - link all repositories that are missed in the current context
update - clone and link in a single operation
pull - pull all repositories in the current directory
Push - Push all repositories in the current directory
commit - commit all repositories in the current directory
En savoir plus sur problème de dépendance récursif des sous-modules git .