web-dev-qa-db-fra.com

SVN: les équivalents externes dans Git?

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?

166
dsimard

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. 

127
Paul

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 ".

33
VonC

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:

  1. Nom unique du référentiel
  2. Chemin relatif du référentiel (démarré à partir du chemin du fichier .gitlinks)
  3. Le référentiel Git qui sera utilisé dans la commande git clone La branche du référentiel à récupérer
  4. Les lignes vides ou les lignes commençant par # ne sont pas analysées (traitées comme des commentaires).

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 .

0
chronoxor