SVN: équivalent externe dans Git?

177

J'ai deux projets SVN en cours d'utilisation à partir d'un autre référentiel SVN utilisant svn: externals .

Comment puis-je avoir la même structure de mise en page de référentiel dans Git?

dsimard
la source
Vous devriez examiner les sous-modules Git . Cela devrait permettre presque exactement ce que vous recherchez.
foxxtrot
7
Quelqu'un a-t-il une nouvelle réponse à cela au cours des 4 dernières années, ou le monde de git est-il le même aujourd'hui?
DougW
4
@DougW Oui, j'ai une nouvelle réponse ci - dessous : git submodulepeut désormais émuler svn:external(depuis mars 2013).
VonC
Pour la dernière version de Git, je suggère de lire les sous-modules Git dans la documentation officielle de Git.
Bulki S Maslom

Réponses:

134

Git a deux approches similaires, mais pas exactement équivalentes à svn: externals:

  • Les fusions de sous-arborescences insèrent le code du projet externe dans un sous-répertoire distinct au sein de votre dépôt. Cela 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 il est compliqué de les renvoyer. Et si l'autre projet doit fusionner à partir de votre code, les historiques de projet sont fusionnés et les deux projets ne font plus qu'un.

  • Les sous-modules Git ( manuel ) sont liés à un commit particulier dans le référentiel d'un autre projet, un peu comme svn: externals avec un-rargument. 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 clones).
    Bien qu'il soit facile de soumettre des modifications à l'autre projet, cela peut entraîner des problèmes si le dépôt a changé. Par conséquent, il n'est généralement pas approprié de soumettre des modifications à un projet en cours de développement actif.

Paul
la source
17
Pour info, il est maintenant possible de spécifier des révisions spécifiques avec svn: externals maintenant (depuis 1.5 ou 1.6 je crois?)
Nate Parsons
9
Pour info, les sous-modules git peuvent être automatiquement gérés et validés. git crée un fichier .gitmodules qui peut / devrait être validé comme le fichier .gitignore. Voir [ git-scm.com/book/en/Git-Tools-Submodules] pour plus d'informations.
mikijov
5
@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 URL relatif a été ajouté.
David W.
@NateParsons mais est-il possible d'omettre les révisions avec les sous-modules git ...> _>
Trejkaz
Je pense qu'il n'est pas possible de git des fichiers uniques de sous-module comme avec svn: externals
user1911091
38

Comme je le mentionne dans " Git submodule new version update ", vous pouvez obtenir la même fonctionnalité externe SVN avec les sous-modules Git 1.8.2:

git config -f .gitmodules submodule.<path>.branch <branch>

C'est suffisant pour qu'un sous-module suive une branche (comme dans le dernier commit d'une branche distante d'un sous-module en amont du dépôt ). Tout ce que vous avez à faire est de:

git submodule update --remote

Cela mettra à jour le sous-module.

Plus de détails sont dans " git submodulele dernier suivi ".

Pour convertir un sous-module existant en un seul suivi d'une branche : voir toutes les étapes dans " Sous-modules Git: Spécifiez une branche / balise ".

VonC
la source
Pouvez-vous faire un paiement partiel comme avec svn:externals?
nowox
@nowox Oui, vous pouvez avoir une caisse clairsemée (git 1.7+ stackoverflow.com/a/2372044/6309 ) associée aux sous-modules ( stackoverflow.com/a/17693008/6309 )
VonC
Malheureusement, toutes les réponses clairsemées liées à la caisse ne donnent jamais d'exemple: (Je vais essayer d'écrire un exemple Gist pour cela ...
nowox
Il y a toujours un problème avec cela. Vous devez toujours obtenir l'historique complet d'un référentiel où vous n'avez besoin que d'une petite partie. Dans mon cas, 100 Ko sur 2 Go. Je peux bien sûr utiliser --depthmais cela ne résout pas vraiment le problème.
nowox
@nowox Il est préférable de poser une nouvelle question expliquant exactement quel est votre cas d'utilisation: je n'ai aucune idée si votre dépôt de 2 Go est un sous-module, ou un dépôt principal avec un sous-module, et ce que vous devez exactement en extraire.
VonC
3

Je suis l'auteur de l' outil gil (git links)

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.

Il fournit également 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 graphique de dépendance de référentiel git

Ensuite, vous pouvez définir le .gitlinksfichier avec la description de la relation des 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 (à partir du chemin du fichier .gitlinks)
  3. Dépôt Git qui sera utilisé dans la branche de dépôt de la commande git clone pour récupérer
  4. Les lignes vides ou commençant par # ne sont pas analysées (traitées comme des commentaires).

Enfin, vous devez mettre à jour votre référentiel d'exemples racine:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

En conséquence, vous clonerez tous les projets requis et les lierez les uns aux autres de manière appropriée.

Si vous souhaitez valider toutes les modifications dans certains référentiels avec toutes les modifications dans les référentiels liés 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

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

En savoir plus sur le problème de dépendance des sous-modules récursifs git .

chronoxor
la source
1
Vous devriez mettre une clause de non-responsabilité en haut de l'article indiquant que vous êtes l'auteur de gil.
Daniel Kamil Kozar