Як перемістити сховище GIT з одного сервера на новий


263

У мене є сервер, який я знімаю. Єдине, що мені залишилося перенести - це моє сховище. Цей сервер вказаний як джерело (головний) для одного з моїх проектів. Який правильний спосіб перемістити сховище, щоб зберегти історію.


Вся інформація (оргін, ствол тощо) про сховище зберігається у папці під назвою '.git', де ви ініціалізуєте сховище. Отже, вам потрібно скопіювати вміст на новий сервер, використовуючи інструкції , при умови , тут
Mansab Uppal

1
просто мерзотник конфігурації remote.origin.url NEWURL см stackoverflow.com/questions/3011402 / ...
Нільс

1
Якщо ви хочете перенести репо, а всі відділення використовують скоріше відповідь jzwiener або Roberto, а не прийняту відповідь.
джонаглон

Відповіді:


246

Щоб додати нове місце репо,

git remote add new_repo_name new_repo_url

Потім перемістіть вміст на нове місце

git push new_repo_name master

Нарешті видаліть стару

git remote rm origin

Після цього ви можете зробити те, що сказав bdonlan, і відредагувати файл.git / config, щоб змінити ім'я new_repo_name на походження. Якщо ви не видалите походження (оригінальний віддалений сховище), ви можете просто просто натиснути зміни на нове репо, за допомогою

git push new_repo_name master

8
Чи це копіювання лише однієї гілки зі старого сховища до нового?
Ендрю Грімм

34
Яке рішення перенести всі гілки?
emmby

49
Ви повинні мати можливість просунути всі гілки відразу через git push -u new_repo_name --all.
rmarscher

10
Міграція всіх гілок можна знайти на stackoverflow.com/a/18336145/923599
jzwiener

10
Замість редагування файлу git-config ця команда працювала для мене:git remote rename new_repo_name origin
Салім

210

Якщо ви хочете перемістити всі гілки та теги, вам слід скористатися такими командами:

git clone --mirror [oldUrl]

клонувати старе репо всі гілки

cd the_repo
git remote add remoteName newRepoUrl

щоб встановити новий пульт

git push -f --tags remoteName refs/heads/*:refs/heads/*

натискати всі посилання на відповіді / голови (що, мабуть, те, що ви хочете)


5
Гіт скаржився на це --tagsі refs/heads/*:refs/heads/*не сумісний із цим --mirror. stackoverflow.com/a/26552740/1484831 добре працював.
Авігіт

3
Я використовував це, і це працювало на мене. Напевно, має бути обрана відповідь. Зверніть увагу, що "код", який ви отримуєте на місцевому рівні, виявляється важким для метаданих, що робить незрозумілим для новачків, якщо щось пішло не так.
нік

3
Це має бути схвалена відповідь. Набагато кращі за інші рішення
Тревіс Гріггс

15
Я в кінцевому підсумку з усіма гілками на моєму новому віддаленому сховище приставкою з refs/heads/refs/headsдопомогою , git push -f --tags remoteName refs/heads/*:refs/heads/*так що я Зміннаgit push remoteName --mirror
dumbledad

1
pushтакож підтримує --mirror. git clone --mirror; cd repo; git push --mirror new_remoteслід зробити трюк
knittl

143

Це працювало на мене бездоганно .

git clone --mirror <URL to my OLD repo location>
cd <New directory where your OLD repo was cloned>
git remote set-url origin <URL to my NEW repo location>
git push -f origin

Я маю зазначити, що це створює дзеркало вашого поточного репо, а потім підштовхує його до нового місця. Тому для великих репостів або повільних зв'язків це може зайняти деякий час .


15
*** Цей ***
Пол Локвуд

1
Це гарне рішення git віддаленого набору URL-адрес <URL до мого НОВОГО місця розташування репо>> після того, як rsync'ed старе походження на новий сервер / місце розташування)
Toni Homedes i Saun

2
Цей прокидається чудово. Немає заплутаних кількох дистанційних
TaoPR

16
Віддавайте перевагу git push --mirror originнад -f.
Айдіакапі

78

Скопіюйте його. Це дійсно так просто. :)

На стороні клієнта просто відредагуйте .git / config у локальній репортації клієнта, щоб вказати віддалені на нову URL за потребою.


6
Ви також можете просто його клонувати. Крім того, замість прямого редагування .git / config-файлу ви можете використовувати git віддалене походження rm; git remote add origin <новий сховище>.
ebneter

4
rming пульт втратить будь-яку конфігурацію відповідно до цього розділу конфігурації - і, клонуючи його, не роблячи зайвих кроків, втрачаються гілки, крім стовбура. З цими проблемами можна впоратися, але, справді, - просто її синхронізуйте.
bdonlan

1
Яке рішення використовує лише git для виконання роботи? rsync вимагає додаткових обручів, через які важко перескочити
emmby

2
це також зберігає, наприклад, гачки та іншу конфігурацію, тому я віддаю перевагу цим чистим рішенням git
mnagel

65

Це робиться частиною в деяких інших відповідях.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new

6
Це, власне, найповніша пряма відповідь.
Лоуренс Дол

3
--mirrorу поштовху дуже важливо: це має бути правильна відповідь
PaoloC

Коли ви ініціалізуєте нове сховище на новому сервері, пам’ятайте, що робити голий git init --bare
marco

35

Я просто повторюю те, що сказали інші, у простому дотриманні списку інструкцій.

  1. Перемістіть сховище: Просто увійдіть на новий сервер, cdу батьківський каталог, де зараз ви хочете зберігати сховище, та rsyncскопіюйте його зі старого сервера:

    new.server> rsync -a -v -e ssh user@old.server.com:path/to/repository.git .
    
  2. Зробіть так, щоб клієнти вказували на нове сховище: тепер для кожного клієнта, що використовує сховище, просто видаліть вказівник на старе джерело та додайте його до нового.

    client> git remote rm origin
    client> git remote add origin user@new.server.com:path/to/repository.git
    

Простий і ефективний. Ви можете додати прапор --bwlimit = XXX, якщо ви хочете обмежити трафік між серверами, де XXX дорівнює пропускної здатності в Кбайт в секунду.
Грег Глокнер

7
Трохи краще, ніж вилучити та додати:git remote set-url origin user@new.server.com:path/to/repository.git
Chris KL

Для тих, хто розгортається на сервері за допомогою git + capistrano, зауважте, що мені довелося використовувати set-url-джерело у двох місцях: у localhost та в кешованій копії, що знаходиться на сервері.
anandvc


10

Я дотримувався вказівок на BitBucket, щоб перемістити репо з усіма його гілками туди. Ось наступні кроки з поясненнями, що слідують за #персонажем:

cd path/to/local/repo
git remote remove origin # to get rid of the old setting, this was not in the BitBucket instructions
git remote add origin ssh://git@bitbucket.org/<username>/<newrepo> # modify URL as needed
git push -u origin --all # pushes _ALL_ branches in one go
git push -u origin --tags # pushes _ALL_ tags in one go

Добре працював для мене.


8

Будь ласка, виконайте кроки:

  • git remote додати нове походження
  • git push - всі нові походження
  • git push - теги нового походження
  • git віддалене походження rm
  • git віддалене перейменування нового походження

5

Це варіант у цій відповіді , який зараз пропонує gitlab "перенести" сховище git з одного сервера на інший.

  1. Припустимо, що ваш старий проект викликається existing_repo, зберігається в existing_repoпапці.

  2. Створіть репо на новому сервері. Ми припустимо, що URL нового проекту єgit@newserver:newproject.git

  3. Відкрийте інтерфейс командного рядка та введіть наступне:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin git@newserver:newproject.git
    git push -u origin --all
    git push -u origin --tags
    

Переваги такого підходу полягають у тому, що ви не видаляєте гілку, що відповідає вашому старому серверу.


4

Можна використовувати таку команду:

git remote set-url --push origin new_repo_url

Приклад з http://gitref.org/remotes/

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/github/git-reference.git (push)
$ git remote set-url --push origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)

4

Повинно бути таким же простим, як:

git remote set-url origin git://new.url.here

Таким чином ви зберігаєте назву originдля нового репо, тоді натисніть на нову репо стару, як детально описано в інших відповідях. Припустимо, що ви працюєте поодинці і у вас є місцеве репо, яке ви хочете віддзеркалити всім своїм суглобом у ньому, ви також можете (зсередини місцевого репо)

git push origin --mirror # origin points to your new repo

але див. Чи достатньо "git push --mirror" для резервного копіювання мого сховища? (усі не використовують, --mirrorале один раз).


3

дотримуйтесь цих інструкцій Якщо ви хочете зберегти всі комісії та гілки від старого до нового репо

git clone --bare <old-repo-url>
cd <old-repo-directory>
git push --mirror <new-repo-url>

1

Ви можете використовувати git-copy для копіювання репо з усіма історіями.

git copy http://a.com/old.git http://a.com/new.git

1

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

  1. Спочатку локально перейдіть до папки (git), до якої потрібно перейти
  2. Створення нового репозиторію в режимі он-лайн Цей крок створює сховище, куди ми можемо надіслати код

Тепер у папці зробіть

git remote get-url origin

Наведена вище команда дає поточний URL віддаленого джерела, корисний для повернення джерела на останньому кроці

git remote set-url origin git@github.newlocation:folder/newrepo.git

Наведена вище команда встановлює віддалене походження на нове місце

git push --set-upstream origin develop

Наведена вище команда підштовхує поточну активну локальну гілку до віддаленого з розвитком імені гілки. Звичайно, вона зберігає всю історію, оскільки з git вся історія також висувається.

git remote set-url origin <original old origin>

Наведена вище команда повертає віддалене джерело до поточного джерела: ви хочете, щоб це було у вашій існуючій папці, і ви, ймовірно, не хочете змішувати своє поточне ім'я локальної папки з новою папкою, яку ви збираєтеся створити для клонування репо ви просто штовхнули на.

Сподіваюся, це допомагає,


0

Якщо ви хочете перемістити сховище #git з одного сервера на новий, ви можете це зробити так:

git clone OLD_REPOSITORY_PATH
cd OLD_REPOSITORY_DIR
git remote add NEW_REPOSITORY_ALIAS  NEW_REPOSITORY_PATH
#check out all remote branches 
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
git push --mirror NEW_REPOSITORY_PATH
git push NEW_REPOSITORY_ALIAS --tags

Усі віддалені гілки та теги зі старого сховища будуть скопійовані у нове сховище.

Виконання цієї команди поодинці:

git push NEW_REPOSITORY_ALIAS

буде копіювати лише головну гілку (лише гілки відстеження) у новий сховище.

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