2009-02-20 9 views
154

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

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

+7

Quelqu'un at-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

+3

@DougW Oui, j'ai une [nouvelle réponse ci-dessous] (http://stackoverflow.com/a/18088319/6309): 'git submodule' peut maintenant émuler' svn: external' (depuis mars 2013). – VonC

Répondre

116

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

  • Subtree se confond insérer le code du projet externe dans un sous-répertoire distinct au sein de votre pension. Cela a un detailed process to set up et est 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 de retirer des modifications de l'autre projet, mais il est compliqué de soumettre des modifications. Et si l'autre projet doit fusionner à partir de votre code, les historiques du projet fusionnent et les deux projets deviennent effectivement un.

  • Git submodules (manual) lien vers un commit particulier dans le dépôt 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 des modifications à l'autre projet, cela peut entraîner des problèmes si le dépôt a été modifié. Par conséquent, il n'est généralement pas approprié de soumettre des modifications à un projet en cours de développement.

+16

FYI, il est maintenant possible de spécifier des révisions spécifiques avec svn: externals maintenant (depuis 1.5 ou 1.6 je crois?) –

+5

Puisque les liens dans la réponse sont périmés, voici quelques nouveaux: [Subtree Merge @ Github: aide] (http://help.github.com/subtree-merge/); [Utilisation des sous-modules @ Github: aide] (http://help.github.com/submodules/); [Sous-modules @ Git manuel de l'utilisateur] (http://schacon.github.com/git/user-manual.html#submodules) – Bart

+6

FYI, les sous-modules git peuvent être automatiquement gérés et validés. git crée un fichier .gitmodules qui peut/doit être validé comme le fichier .gitignore. Voir [http://git-scm.com/book/fr/Git-Tools-Submodules] pour plus d'informations. – mikijov

6

Vous devriez regarder dans Git submodules. Cela devrait permettre presque exactement ce que vous cherchez.

+0

@JonathonReinhart - J'ai fait l'édition – Sonny

27

Comme je le mentionne dans « Git submodule new version update », vous pouvez obtenir le même SVN fonction externe avec Git 1.8.2 sous-modules:

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

Cela suffit pour un sous-module pour suivre une branche (comme dans le dernier commit d'une branche distante d'un sous-module upstream repo). Tout ce que vous devez faire est un:

git submodule update --remote 

Cela mettra à jour le sous-module.

Plus de détails sont dans "git submodule tracking latest".

Pour convertir un sous-module existant en un suivi d'une branche: voir toutes les étapes de « Git submodules: Specify a branch/tag ».

+0

Pouvez-vous faire une extraction partielle comme avec 'svn: externals'? – nowox

+0

@nowox Oui, vous pouvez avoir un paiement clairsemé (git 1.7+ https://stackoverflow.com/a/2372044/6309) associé à des sous-modules (https://stackoverflow.com/a/17693008/6309) – VonC

+0

malheureusement tous les Les réponses relatives à la caisse clairsemée ne donnent jamais d'exemple :(Je vais essayer d'écrire un exemple de Gist pour cela ... – nowox

1

Pour la dernière version de Git, je suggère de lire à propos de Git submodules dans la documentation officielle de Git.

Questions connexes