Как перенести GIT-репозиторий с одного сервера на новый


264

У меня есть сервер, который я отключаю. Единственное, что мне осталось перенести, это мой репозиторий. Этот сервер указан как источник (мастер) для одного из моих проектов. Как правильно перемещать хранилище, чтобы сохранить историю.


Вся информация (orgin, trunk и т. Д.) О хранилище хранится в папке с именем .git, где вы инициализируете хранилище. Таким образом, вам необходимо скопировать содержимое на новый сервер, используя инструкции, приведенные здесь
Mansab Uppal

1
просто git config remote.origin.url newurl, см. stackoverflow.com/questions/3011402/…
Niels

1
Если вы хотите перенести свое репо и все ветки, используйте ответ jzwiener или Roberto, а не принятый ответ.
Jonaglon

Ответы:


247

Чтобы добавить новое местоположение репо,

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 на origin. Если вы не удалите источник (исходный удаленный репозиторий), вы можете просто отправить изменения в новый репозиторий с помощью

git push new_repo_name master

8
Будет ли это копировать только одну ветку из старого репозитория в новый?
Эндрю Гримм

34
Какое решение перенести все филиалы?
Эмбби

50
Вы должны быть в состоянии протолкнуть все ветви одновременно через 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
Salim

210

Если вы хотите перенести все ветви и теги, вы должны использовать следующие команды:

git clone --mirror [oldUrl]

клонировать старый репо со всеми ветками

cd the_repo
git remote add remoteName newRepoUrl

настроить новый пульт

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

подтолкнуть все ссылки под refs / Heads (что, вероятно, то, что вы хотите)


5
Git жаловался, что --tagsи refs/heads/*:refs/heads/*не совместимы с --mirror. stackoverflow.com/a/26552740/1484831 работал хорошо.
Avigit

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

144

Это сработало для меня без нареканий .

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 remote set-url origin <URL-адрес моего НОВОГО местоположения репозитория> (после rsync'а старого источника на новый сервер / местоположение)
Toni Homedes i

2
Этот просыпается отлично. Не
надо

17
Предпочитаю git push --mirror originболее -f.
Aidiakapi

78

Скопируйте это. Это действительно так просто. :)

На стороне клиента, просто отредактируйте .git / config в локальном репозитории клиента, чтобы указать удаленным пользователям новый URL при необходимости.


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

4
При удалении команды все настройки в этом разделе конфигурации будут потеряны, а при клонировании без дополнительных действий будут потеряны ветви, отличные от транка. С этими проблемами можно справиться, но на самом деле - просто rsync.
bdonlan

1
Какое решение использует только git для работы? Для rsync требуются дополнительные административные функции, через которые сложно прыгнуть
emmby

2
это также сохраняет, например, хуки и другую конфигурацию, поэтому я предпочитаю это чистым git-решениям
mnagel

66

Это как бы сделано по частям в некоторых других ответах.

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

7
Это, по сути, самый полный, прямой ответ.
Лоуренс Дол

4
--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
Крис KL

Для тех, кто развертывает на сервер, используя git + capistrano, обратите внимание, что мне пришлось использовать источник set-url в 2 местах: на локальном хосте и на кэшированной копии, находящейся на сервере.
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 remote rm origin
  • Git Remote переименовать происхождение нового происхождения

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

Приведенная выше команда переводит текущую активную локальную ветвь в удаленную с разработкой branchname. Конечно, это сохраняет всю историю, так как с 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.