184 votes

SVN:externals équivalent 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 ?

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 émuler svn:external (depuis mars 2013).

137voto

Paul Points 12977

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.

18 votes

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 ?).

9 votes

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.

6 votes

@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é.

40voto

VonC Points 414372

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

0 votes

Est-il possible d'effectuer un contrôle partiel comme avec svn:externals ?

0 votes

@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 )

0 votes

Malheureusement, toutes les réponses relatives à la caisse ne donnent jamais d'exemple :( J'essaierai d'écrire un exemple Gist pour cela...

7voto

foxxtrot Points 6491

Vous devriez vous pencher sur les points suivants git submodules Il devrait permettre d'obtenir presque exactement ce que vous recherchez.

7voto

chronoxor Points 2053

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 :

  1. Nom unique du référentiel
  2. Chemin relatif du dépôt (à partir du chemin du fichier .gitlinks)
  3. Dépôt Git qui sera utilisé dans la commande git clone Branche du dépôt à extraire
  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 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 .

2voto

Hank Gay Points 36173

Prograide.com

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.

Powered by:

X