2012-02-05 5 views
3

J'utilise Git depuis un moment et je souhaite convertir mon flux de production habituel en Mercurial. En particulier, je suis intéressé à convertir le flux de travail que j'utiliserais pour contribuer à un projet Git afin de pouvoir contribuer à un projet Mercurial.Conversion du flux de production Git en Mercurial

En règle générale, pour un projet sur GitHub, je bifurquer le projet sur GibHub du projet d'origine, puis aller chercher les deux localement, avec deux noms différents à distance:

# Clone the initial repository and call the remote repository 'github-origin' 
git clone -o github-origin git://github.com/orig_author/project.git 

# Add the forked GitHub repo as an additional remote repo ('github-mine') 
cd project 
git remote add github-mine git://github.com/me/project.git 
git fetch github-mine 

Lorsque je liste les branches avec git branch -a , je reçois quelque chose comme ceci:

* master 
    remotes/github-mine/some_feature 
    remotes/github-mine/master 
    remotes/github-origin/HEAD -> github-origin/master 
    remotes/github-origin/some_feature 
    remotes/github-origin/master 

je peux créer mes propres succursales locales en utilisant git checkout -b new_feature puis repoussez à mon dépôt GitHub, ajoutant ainsi deux références:

* my_feature 
    remotes/github-mine/my_feature 

Je peux ensuite contacter l'auteur original pour discuter de cette fonctionnalité, soumettre une demande d'extraction et ainsi de suite. Tout ce flux de travail est en fait assez indépendant de la ligne de temps de travail de l'auteur d'origine. Cela rend assez facile de discuter des fonctionnalités expérimentales sans poluer le référentiel du projet principal.

Si l'auteur d'origine a effectué plus de modifications, je peux suivre git fetch github-orig et éventuellement fusionner ou rebaser mes modifications locales en conséquence. En tant que test rapide (en supposant par branche courante est my_feature):

git fetch github-origin 
git checkout -b temp 
git rebase github-origin/master 

Un point essentiel de ce flux de travail est d'être en mesure de savoir où la branche de chaque dépôt est situé par rapport à mes propres branches. En particulier, il est important de savoir que mes branches ne sont pas les mêmes que les branches distantes avec le même nom (même entre les deux référentiels GitHub, les deux branches master n'ont pas besoin d'être identiques, par exemple). Voir tout cela est quelque chose de très facile en utilisant gitk --all.

Je ne suis pas sûr de savoir comment faire la même chose sur un projet Mercurial (par exemple sur BitBucket).

Voici ce que j'ai essayé de faire, à partir de cette Command Equivalence Table:

hg clone https://bitbucket.org/orig_author/project 

# Edit .hg/hgrc and add 'bb-mine=https://bitbucket.org/.../project' to [paths] 

# Apparently equivalent to git fetch. 
hg pull bb-mine 

Cela semble fonctionner, et il tire les commits à distance (en fait, je l'ai essayé cela sur un référentiel dans lequel J'ai déjà poussé une de mes branches). Je peux voir toutes les branches en utilisant hg branches, mais aucune indication quant à d'où ils viennent. hg view ne montre vraiment rien. Plus important encore, mon tip est maintenant le dernier de mes commits, mais je n'ai pas un équivalent de l'étiquette github-origin/master que j'aurais (que ce soit avant mes propres commits ou après si un autre auteur a fait plus de changements). Je voudrais être en mesure de faire un hg pull (équivalent de git fetch) à tout moment dans le futur pour voir quelles sont les différences entre ma copie locale et les nouvelles modifications apportées par l'autre auteur (s) sont sans changer nécessairement quelque chose dans mon référentiel local ou dans mon dépôt BitBucket (au moins jusqu'à ce que j'ai résolu les conflits potentiels dus à ces changements). De plus, j'ai aussi tendance à avoir mon propre dépôt backup lorsque j'utilise Git (qui est un serveur SSH où je peux pousser toutes les branches, même en cours de développement qui n'est pas encore destiné à être publié).Je me rends compte que la voie de Mercurial de ramification n'est pas tout à fait la même que la manière de Git. Cependant, y a-t-il un flux de travail équivalent pour Mercurial, ou devrais-je simplement changer d'approche? Comment puis-je voir où se trouvent chacun des dépôts que j'utilise avec leurs succursales respectives (dont certaines peuvent avoir en commun)?

+0

Une raison pour laquelle vous auriez besoin d'utiliser Hg? –

+0

@AdamDymitruk Les projets que je voudrais fourcher utilisent Hg. J'ai regardé dans l'utilisation du pont hg-git, mais cela semble rendre le workflow plus compliqué, surtout si je dois utiliser ma propre branche Hg du projet sur quelque chose comme BitBucket pour les requêtes pull. – Bruno

Répondre

6

Ceci est une énorme question, donc je vais choisir quelques points. Je pense que vous devriez venir au IRC channel ou au mailinglist pour plus de conseils - je prédis que vos (plus) questions seront d'un genre de discussion de la nature et il est beaucoup mieux d'en discuter ici.

[...] Plus important encore, mon tip est maintenant le dernier de mes commits, mais je ne dispose pas d'un équivalent de l'github origine/label maître que j'aurais (que ce soit avant mon commet ou après si un autre auteur a fait plus de changements). Ne mettez pas beaucoup l'accent sur le tip étiquette. C'est un concept obsolète qui signifie de moins en moins quand vous avez plusieurs branches. Le principal problème est que c'est juste le plus récent changeset dans votre dépôt et donc il va passer de la branche (nommée) à la branche (nommée) quand vous tirez. Nous préférons parler de default à la place et d'autres branches/signets nommés car ces identifiants se déplacent de manière plus contrôlée. Comment puis-je voir où se trouvent chacun des dépôts que j'utilise avec leurs branches respectives (dont certaines peuvent avoir des points communs)?

Le remotebranches extension peut vous aider à obtenir un flux de production plus semblable à Git ici. Mais en général, vous devriez regarder dans bookmarks si vous voulez des branches semblables à Git dans Mercurial. Le named branches que vous créez avec hg branch ressemble peu aux branches que vous créez avec git branch (Git ne possède pas le concept de branche nommé de Mercurial).

Utilisez hg incoming et hg outgoing pour voir les différences entre les référentiels. C'est ainsi que je vois normalement ce qui doit être extrait ou poussé vers un autre clone.