J'ai deux projets SVN en cours d'utilisation à partir d'un autre dépôt SVN en utilisant svn:externals .
Comment puis-je avoir la même structure de dépôt dans Git ?
J'ai deux projets SVN en cours d'utilisation à partir d'un autre dépôt SVN en utilisant svn:externals .
Comment puis-je avoir la même structure de dépôt dans Git ?
Git a deux approches similaires, mais pas exactement équivalentes à svn:externals :
Fusions de sous-arbres insérer le code du projet externe dans un sous-répertoire distinct de votre répertoire. Celui-ci possède un processus détaillé de mise en place et c'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 des modifications de l'autre projet, mais il est difficile d'en renvoyer. Et si l'autre projet doit fusionner à partir de votre code, l'historique du projet est fusionné et les deux projets ne font plus qu'un.
Sous-modules Git ( manuel ) vers un commit particulier dans le dépôt d'un autre projet, tout comme svn:externals avec un lien -r
argument. Les sous-modules sont faciles à mettre en place, 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 renvoyer les modifications à l'autre projet, cela peut poser des problèmes si le répertoire a changé. C'est pourquoi il n'est généralement pas approprié de renvoyer des modifications à un projet en cours de développement.
Pour information, il est maintenant possible de spécifier des révisions spécifiques avec svn:externals (depuis la 1.5 ou 1.6 je crois ?).
Pour information, les sous-modules git peuvent être gérés et validés automatiquement. git crée un fichier .gitmodules qui peut/doit être validé tout comme le fichier .gitignore. Voir [ [git-scm.com/book/fr/Git-Tools-Submodules]](http://git-scm.com/book/en/Git-Tools-Submodules]) pour plus d'informations.
@NateParsons Il a toujours été possible de spécifier des numéros de révision exacts avec svn:externals
. Avec la révision 1.5, la syntaxe a été modifiée pour un format plus flexible. L'adressage relatif des URL a été ajouté.
Comme je le mentionne dans " Mise à jour de la nouvelle version d'un sous-module Git "Vous pouvez obtenir la même fonctionnalité externe de 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 repo en amont ). Tout ce que vous avez à faire, c'est a :
git submodule update --remote
Cela mettra à jour le sous-module.
Plus de détails dans " git submodule
suivi des dernières ".
Pour convertir un sous-module existant en un sous-module qui suit une branche : voir toutes les étapes dans " Sous-modules Git : Spécifier une branche/étiquette ".
@nowox Oui, il est possible d'avoir un checkout clairsemé (git 1.7+). stackoverflow.com/a/2372044/6309 ) associés aux sous-modules ( stackoverflow.com/a/17693008/6309 )
Malheureusement, toutes les réponses relatives à la caisse ne donnent jamais d'exemple :( J'essaierai d'écrire un exemple Gist pour cela...
Vous devriez vous pencher sur les points suivants git submodules Il devrait permettre d'obtenir presque exactement ce que vous recherchez.
Je suis l'auteur de outil gil (liens git)
J'ai une solution alternative au problème - outil gil (liens git)
Il permet de décrire et de gérer les dépendances complexes des dépôts git.
Il apporte également une solution au problème de la problème de dépendance des sous-modules récursifs de git .
Considérez que vous avez les dépendances suivantes pour votre projet : exemple de graphe de dépendance du dépôt git
Vous pouvez alors définir .gitlinks
avec la description de la relation entre les dépôts :
# 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 dans le format suivant :
Enfin, vous devez mettre à jour votre référentiel d'échantillons Root :
# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link
# The same result with a single command
gil update
Vous clonerez ainsi tous les projets nécessaires et les relierez les uns aux autres de manière appropriée.
Si vous souhaitez valider toutes les modifications d'un référentiel avec toutes les modifications des référentiels enfants liés, vous pouvez le faire avec une seule commande :
gil commit -a -m "Some big update"
Les commandes "pull" et "push" fonctionnent de la même manière :
gil pull
gil push
L'outil Gil (git links) prend en charge 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
Plus d'informations problème de dépendance des sous-modules récursifs de git .
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Vous devriez vous pencher sur les points suivants Sous-modules Git . Il devrait permettre d'obtenir presque exactement ce que vous recherchez.
8 votes
Quelqu'un a-t-il trouvé une nouvelle réponse à cette question au cours des 4 dernières années, ou le monde de git est-il le même aujourd'hui ?
4 votes
@DougW Oui, j'ai un nouvelle réponse ci-dessous :
git submodule
peut désormais émulersvn:external
(depuis mars 2013).0 votes
Pour la dernière version de Git, je vous conseille de lire le document suivant Sous-modules Git dans la documentation officielle de Git.