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

264

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

cjibo
источник
Вся информация (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 (что, вероятно, то, что вы хотите)

jzwiener
источник
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 при необходимости.

bdonlan
источник
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
15

Посмотрите на этот рецепт на GitHub: https://help.github.com/articles/importing-an-external-git-repository

Я попробовал несколько методов, прежде чем обнаружить git push --mirror.

Работал как шарм!

Джон Смит
источник
Поэтому в основном git clone --mirror ..., git remote add ...,git push --mirror ...
mwfearnley
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 переименовать происхождение нового происхождения
Boush
источник
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)
mrroboaat
источник
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но один раз).

Mr_and_Mrs_D
источник
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
Quanlong
источник
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>

Приведенная выше команда устанавливает удаленный источник на ваш текущий источник: вам это нужно, потому что вы находитесь в существующей папке и, возможно, не хотите смешивать имя текущей локальной папки с новой папкой, которую вы собираетесь создать для клонирования репозитория. Вы только что подтолкнули к.

Надеюсь это поможет,

Hace
источник
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

будет только копировать основную ветку (только отслеживание ветвей) в новый репозиторий.

maestr0
источник