Git подтолкнуть существующее репо к новому и другому удаленному серверу репо?

494

Скажем, у меня есть репозиторий на git.fedorahosted.org, и я хочу клонировать это в свой аккаунт на github, чтобы иметь собственную игровую площадку помимо более «официального» репо на fedorahosted. Каковы были бы шаги, чтобы первоначально скопировать это? В github есть хорошая кнопка "fork", но я не могу использовать ее по понятным причинам.

И как бы я отслеживал изменения в репозитории fedorahosted в github?

Хайко Рупп
источник

Ответы:

751
  1. Создайте новый репо на github.
  2. Клонируйте репо из fedorahosted на ваш локальный компьютер.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Теперь вы можете работать с ним, как и с любым другим репозиторием на github. Чтобы вытянуть патчи из апстрима, просто бегите git pull upstream master && git push origin master.

troelskn
источник
14
Нет смысла переименовывать оригинал, просто назовите новую игровую площадку как-нибудь еще.
Такасвелл
34
@tcaswell Технически нет, но это строгое соглашение, которое originуказывает на каноническое удаленное местоположение. В этом случае местоположение github предположительно будет каноническим.
troelskn
1
Я бы посчитал каноническим местом «вверх по течению», но я думаю, что это начало раскалываться.
Tacaswell
3
Может быть, я должен написать другой вопрос, но я думаю, что вы, ребята, обсуждаете то, что я хочу. Я хотел бы добавить новый пульт, а не заменять существующий, чтобы я мог продолжать извлекать из старого репозитория, но вносить любые изменения в новый.
ThatAintWorking
13
@ThatAintWorking Вам, вероятно, следует открыть новый вопрос, но вкратце - вы можете добавить любое количество пультов с помощью команды git remote add. Затем вы можете нажать на один из них, явно указав пульт дистанционного управления git push. Например, git push foobar masterчтобы подтолкнуть текущую ветку к masterудаленному foobar.
troelskn
108

На этот вопрос есть удаленный ответ с полезной ссылкой: https://help.github.com/articles/duplicating-a-repository

Суть

0. create the new empty repository (say, on github)
1. make a bare clone of the repository in some temporary location
2. change to the temporary location
3. perform a mirror-push to the new repository
4. change to another location and delete the temporary location

Пример ОП:

На вашей локальной машине

$ cd $HOME
$ git clone --bare https://git.fedorahosted.org/the/path/to/my_repo.git
$ cd my_repo.git
$ git push --mirror https://github.com/my_username/my_repo.git
$ cd ..
$ rm -rf my_repo.git
чернь
источник
5
Какая польза от простого клона и зеркала, просто добавляющего и перемещающего другой пульт? Неужели все ветви будут перемещены, а не только текущая? (Если это так, это кажется ограничением принятого ответа, который следует отметить.)
yoyo
3
Это была именно та информация, которую я искал, --bare / --mirror - это обычно то, что люди хотят выполнять! Это важный ответ! Спасибо
claf
1
Большой! Определенно самый правильный ответ по теме вопроса. Спасибо! Если я не делаю так, я всегда получаюerror: failed to push some refs to 'https://github.com/username/testrep.git'
Денис Бабарыкин
45

Чтобы перенести существующее репо в другое, вам необходимо:

  1. Сначала клонируйте оригинальное репо.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Вставьте клонированные источники в ваш новый репозиторий:

    cd rhq
    git push https://github.com/user/example master:master
    

Вы можете перейти master:masterв source:destinationфилиал.


Если вы хотите выдвинуть конкретный коммит (ветвь), то выполните:

  1. В исходном репо создайте и оформите новую ветку:

    git checkout -b new_branch
    
  2. Выберите и сбросьте точку, с которой вы хотите начать:

    git log # Find the interesting hash
    git reset 4b62bdc9087bf33cc01d0462bf16bbf396369c81 --hard
    

    Либо выберите коммит, git cherry-pickчтобы добавить в существующий заголовок.

  3. Затем нажмите на ваш новый репо:

    git push https://github.com/user/example new_branch:master
    

    Если вы перебазируете, используйте -fдля принудительного толчка (не рекомендуется). Запустите, git reflogчтобы увидеть историю изменений.

kenorb
источник
2
git push ... old_branch_name:new_branch_nameпозволяет выдвинуть ветвь функции из старого хранилища в качестве основной ветви в новом хранилище. Полезно!
gorjanz
Это был самый простой способ для меня сделать это.
Адам
15

Вы действительно хотите просто перенести свой локальный репозиторий (с его локальными ветвями и т. Д.) На новый пульт или вы действительно хотите отразить старый пульт (со всеми его ветвями, тегами и т. Д.) На новом пульте? Если последнее, то здесь отличный блог о том, как правильно отразить git-репозиторий .

Я настоятельно рекомендую вам прочитать блог для некоторых очень важных деталей, но короткая версия такова:

В новом каталоге запустите эти команды:

git clone --mirror git@example.com/upstream-repository.git
cd upstream-repository.git
git push --mirror git@example.com/new-location.git
Собачья шерсть
источник
Я думаю, что это ссылка: blog.plataformatec.com.br/2013/05/…
Дэвид
11

Попробуйте это Как переместить полный репозиторий Git

  1. Создайте локальный репозиторий в каталоге temp-dir, используя:

    Git Clone Temp-Dir

  2. Перейдите в каталог temp-dir.

  3. Чтобы увидеть список различных ветвей в ORI, сделайте:

    git branch -a
    
  4. Оформите все ветви, которые вы хотите скопировать из ORI в NEW, используя:

    git checkout branch-name
    
  5. Теперь извлеките все теги из ORI, используя:

    git fetch --tags
    
  6. Перед выполнением следующего шага обязательно проверьте локальные теги и ветви с помощью следующих команд:

    git tag
    
    
    git branch -a
    
  7. Теперь очистите ссылку на репозиторий ORI с помощью следующей команды:

    git remote rm origin
    
  8. Теперь свяжите ваш локальный репозиторий с новым созданным репозиторием, используя следующую команду:

    git remote add origin <url to NEW repo>
    
  9. Теперь добавьте все свои ветви и теги с помощью этих команд:

    git push origin --all
    
    
    git push --tags
    
  10. Теперь у вас есть полная копия вашего репозитория ORI.

vm345
источник
9

Я нашел решение, используя set-url, которое является кратким и довольно простым для понимания :

  1. создать новый репо на Github
  2. cd в существующий репозиторий на вашем локальном компьютере (если вы еще не клонировали его, сделайте это сначала)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master
Mobiletainment
источник
9

Если у вас есть существующее хранилище Git:

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/newproject
git push -u origin --all
git push -u origin --tags
Камил Неканович
источник
1
Просто чтобы уточнить, - все будут толкать все ветви
GilCol
7

Просто укажите новый репо, изменив URL репозитория GIT с помощью этой команды:

git remote set-url origin [new repo URL]

Пример: git remote set-url origin git@bitbucket.org:Batman/batmanRepoName.git

Теперь подталкивание и вытягивание связаны с новым РЕПО.

Затем нажимаем нормально так:

git push -u origin master
Абдель Уримчи
источник
2

У меня была такая же проблема.

В моем случае, поскольку у меня есть оригинальный репозиторий на локальном компьютере, я сделал копию в новой папке без каких-либо скрытых файлов (.git, .gitignore).

Наконец, я добавил файл .gitignore в новую созданную папку.

Затем я создал и добавил новый репозиторий с локального пути (в моем случае это GitHub Desktop).

itrascastro
источник
1

Вот ручной способ сделать git remote set-url origin [new repo URL]:

  1. Клонировать репозиторий: git clone <old remote>
  2. Создать репозиторий GitHub
  3. открыто <repository>/.git/config

    $ git config -e
    
    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = <old remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    

    и измените пульт (опция URL)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Нажмите на хранилище для GitHub: git push

Вы также можете использовать оба / несколько пультов .

ВНО
источник
Я искал ту же проблему, а затем сделал то же самое и сработал.
Мохит Патидар