Мост Git к Mercurial - PullRequest
       19

Мост Git к Mercurial

4 голосов
/ 09 июля 2010

Я работаю в основном с Git и у меня много кода на github. Я также хотел бы иметь его в Bitbucket, для людей, использующих Mercurial, но что более важно, так как я хочу также иметь код на моем домиане, а BItbucket поддерживает Cnames для размещенного кода.

Так есть ли способ для меня, в основном, работать с Git, но также иметь возможность перейти к HG.

Github создал проект в другом направлении (для репозиториев HG в git), но есть ли один для направления, которое я ищу.

Ответы [ 2 ]

7 голосов
/ 09 июля 2010

Я собирался добавить это к своему другому ответу, но это заняло немного времени, поэтому мы сделаем это как отдельный ответ.

Если вы хотите пойти в обе стороны, вы можете использовать hg-git , чтобы получить hg версию репо на вашем компьютере.Вы по-прежнему можете выполнять всю свою работу в Git, это просто означает, что вы будете использовать GitHub в качестве своего посредника.

$ cd src
# do some work
# push to GitHub
$ cd ../hg
$ hg pull
$ hg push bitbucket

Однако у него есть то преимущество, что если вы хотите получить изменения из MercurialПользователь, вы можете перетащить их в репозиторий hg и отправить их на GitHub.

$ cd hg
$ hg pull someotherrepo
  # Probably merge
$ hg push # Changes go to GitHub
$ cd ../src
$ git pull
  # Continue working in Git
4 голосов
/ 09 июля 2010

Если вы просто делаете зеркало репозитория (ов) Git, то вы можете настроить задачу cron для запуска следующего скрипта:

#!/bin/bash

USER=bitbucketuser
ERROR_FILE=clone_update_err
CLONES=/path/to/clones

cd $CLONES

if [ $# -ne 1 ]; then
    for DIR in *; do
        if [ -d $DIR ]; then
            ./update.sh $DIR 2> $ERROR_FILE
            if [ -s $ERROR_FILE ]; then
                echo $DIR >&2
                cat -n $ERROR_FILE >&2
            fi
        fi
    done
else
    DIR=$1
    echo $DIR
    cd $DIR

    if [ -a source ]; then
        cd source
        if [ -d .hg ]; then
            hg pull
        elif [ -d .git ]; then
            git pull
        elif [ -d .bzr ]; then
            bzr pull
        elif [ -d .svn ]; then
            svn up
        else
            echo "$DIR is not a known repository type."
            return 1
        fi

        cd ..
        hg convert source hg

        URL=ssh://hg@bitbucket.org/$USER/$DIR/
        cd hg
        hg pull $URL
        hg push $URL # You can add -f here if you don't mind multiple heads
        cd ..
    else
        # hg dir or hg-git
        cd hg
        hg pull
        hg push $URL
        cd ..
    fi

    cd ..

    sleep 5
fi

Предполагается, что у вас установлен ключ SSH. Как вы видите, он будет отражать и другие VCS. Предполагается структура каталогов, подобная этой:

clones/
  project1/
    source/  # Original Git/Bazaar/SVN/Mercurial repo
    hg/      # Mercurial repo

Очевидно, что это только в одну сторону, но если вы выполняете всю свою работу в Git, то это не имеет значения.

...