Git підштовхне існуюче репо до нового та іншого віддаленого сервера репо?


494

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

І як я можу відслідковувати зміни у fedorahosted repo в 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 repo. Щоб витягнути патчі з верхів'я, просто запустіть git pull upstream master && git push origin master.


14
Немає підстав перейменовувати оригінальне походження, просто зателефонуйте на новий ігровий майданчик чимось іншим.
tacaswell

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щоб додати її до існуючої HEAD.

  3. Потім перейдіть до нового репо:

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

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


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.


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

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).


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

Ви також можете використовувати обидва / кілька віддалених .


Я шукав ту саму проблему, а потім робив те саме і працював.
Мохіт Пацідар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.