J’utilise pour contrarier mon entreprise de central
référentiel. Nous avons récemment créé une nouvelle branche de fonctionnalité dans le repo central. Comment puis-je dire à ce sujet ? Quand je lance
je ne vois que les branches qui existait lorsque j’ai couru contre le
repo pour initialiser mon `` repo ?
Réponses
Trop de publicités?Si vous souhaitez suivre TOUTE la distance svn branches, puis la solution est aussi simple que:
git svn fetch
Cela permettra de récupérer TOUTES les branches distantes qui n'ont pas été récupérées encore.
Autre conseil: si vous avez coché uniquement le tronc au premier abord, et plus tard, vous souhaitez suivre TOUTES les branches, puis modifiez .git/config
pour ressembler à cela et ré-exécutez git svn fetch
:
[svn-remote "svn"]
url = https://svn/path_to_repo_root/
fetch = path_to_trunk:refs/remotes/git-svn
branches = path_to_branches/*:refs/remotes/*
Les points clés sont url
doit pointer vers la racine du dépôt, et les chemins définis dans fetch
et branches
doit être relative à l' url
.
Si vous souhaitez récupérer uniquement les branches spécifiques au lieu de TOUS, il est un bel exemple, en git svn --help
:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
Avec les anciennes versions d' git-svn
, une fois que vous avez spécifié les branches comme cela, vous pourriez ne pas être en mesure d'obtenir de nouvelles branches avec git svn fetch
. Une solution de contournement est d'ajouter plus d' fetch
lignes, comme ceci:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
fetch = branches/blue:refs/remotes/branches/blue
fetch = branches/yellow:refs/remotes/branches/yellow
branches = branches/{red,green}/src:refs/remotes/branches/*
Une autre solution de contournement par @AndyEstes: éditer .git/svn/.metadata
et de modifier la valeur de branches-maxRev
ou tags-maxRev
d'une révision avant tout venez d'indiquer, de succursales ou de balises ont été créées. Une fois que vous avez fait cela, exécutez git svn fetch
pour suivre le svn nouvelle succursale à distance.
Peut-être que j'ai tout fait foiré, mais j'ai suivi les instructions de la section vjangus réponse et presque travaillé. Le seul problème était que newbranch ne semble pas être ramifiée à partir du tronc. Dans gitk, c'était une sorte de "flottant" à lui tout seul; il n'avait pas d'ancêtre commun avec le tronc.
La solution à ce problème est:
- Trouver le SHA1 du dernier commit qui s'est passé sur le tronc avant de la branche a été créée.
- Trouver le SHA1 du premier commit sur la branche (le message est probablement "a Créé une nouvelle branche, copié à partir du tronc@12345" ou quelque chose)
-
git diff-tree <sha1 from step 1> <sha1 from step 2>
-- il ne devrait pas être de sortie. Si il est de sortie, vous avez choisi le mauvais s'engage. -
git checkout local-newbranch
alorsgit rebase <sha1 from step 1>
. Ce sera rebaselocal-newbranch
sur le nouvel arbre, maisremotes/newbranch
sera toujours déconnecté. - Go pour le fichier
.git/refs/remotes/newbranch
et l'éditer pour contenir la SHA1 du nouveau commit (sur la relocaliséenewbranch
) qui correspond à l'ancien commit il est pointé. (Ou peut-être utilisergit-update-ref refs/remotes/newbranch <new-SHA>
. Merci inger.) - La prochaine fois que vous
git svn dcommit
denewbranch
, vous aurez un tas de messages à propos de la mise à jour des journaux. C'est normal je pense.
Je vous recommandons de conserver gitk --all
ouvert tout le temps, et rafraîchissant souvent à garder une trace de ce que vous faites. Je suis toujours en sorte de nouveau à git git svn, donc s'il vous plaît suggérer des améliorations apportées à cette méthode.
Je n'ai pas trouvé aucune documentation sur cette fonctionnalité, mais on dirait que git svn configuration prend en charge plusieurs récupérer les entrées. De cette façon, vous pouvez également ajouter des branches séparément, sans avoir besoin d'ajouter un autre à distance dépôt svn de l'entrée à votre config, ni à l'aide de caractères génériques pour obtenir toutes les branches de certains répertoires.
Supposons que votre SVN arbre est vraiment désagréable d'avoir beaucoup de branches sans aucune logique la façon dont ils sont situés, par exemple, d'avoir des branches et des sous-répertoires contenant plus ramifié.
c'est à dire
trunk
branches
-> branch1
-> sub-dir1
-> branch2
-> branch3
-> sub-dir2
-> branch4
-> sub-dir3
-> branchX
<... hundreds more ...>
et vous voulez juste de ramasser quelques branches d'être inclus dans votre dépôt git.
Vous pouvez d'abord init votre dépôt avec seulement tronc sans branches:
git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk
Après cela, vous devriez voir la configuration suivante:
localhost: elhigu$ git config --get-regexp "svn-remote."
svn-remote.svn.url https://svn.com/MyRepo
svn-remote.svn.fetch trunk:refs/remotes/svn/trunk
si jamais vous voulez vous procurer une nouvelle branche de MyRepo vous pouvez simplement ajouter de nouveaux aller chercher les entrées de configuration:
git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4
Ou vous pouvez modifier la configuration .git/config
Pour aller chercher les nouvelles branches après les ajouter à la config il suffit d'exécuter:
git svn fetch -r 10000:HEAD
[Edit] Parfois, il semble être nécessaire d'exécuter la chercher avec --tous les paramètre pour récupérer nouvellement ajoutée des branches:
git svn fetch --all -r 10000:HEAD