Перемещение содержимого репозитория Git в другой репозиторий с сохранением истории


141

Я пытаюсь переместить только содержимое одного репозитория ( repo1) в другой существующий репозиторий ( repo2) с помощью следующих команд:

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

Но это не работает. Я просмотрел аналогичный пост, но нашел только одно перемещение папки, а не содержимое.


Хотите ли вы иметь содержимое repo1 как ветку на repo2 или как часть master, чтобы папки обоих репо сосуществовали в вашем рабочем каталоге?
Chronial

Я хочу переместить это как часть мастера.
Марио

4
Этот урок идеально подходит! smashingmagazine.com/2014/05/19/…
xpto

Ответы:


242

Я думаю, что команды, которые вы ищете:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

После этого repo2/masterбудет содержать все от repo2/masterи repo1/master, а также будет иметь историю обоих.


Спасибо Chronial, я просто хочу убедиться, что у repo1 также есть одна ветка, и что, если я хочу переместить эту ветку также в repo2?
Марио

хорошо, у repo2 также есть вторая ветка? Или что должно случиться с этой веткой?
Хрони

1
Хронический, вышеупомянутые команды не работали! это не скопировало историю.
Марио

1
Хорошо, теперь это сработало. Я использовал следующую команду: cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin origin master
Марио

1
@abhijithda Самое простое решение состоит в том, чтобы просто переместить все внутри repo1подпапки (внутри repo1) перед выполнением слияния.
19

55

Отлично описано здесь https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

Сначала мы должны извлечь все удаленные ветви и теги из существующего репозитория в наш локальный индекс:

git fetch origin

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

git branch -a

Давайте используем SSH-клонированный URL нашего нового репозитория, чтобы создать новый удаленный в нашем существующем локальном репозитории:

git remote add new-origin git@github.com:manakor/manascope.git

Теперь мы готовы отправить все локальные ветви и теги на новый пульт с именем new-origin:

git push --all new-origin 
git push --tags new-origin

Давайте сделаем new-origin удаленным по умолчанию:

git remote rm origin

Переименуйте new-origin только в origin, чтобы он стал удаленным по умолчанию:

git remote rename new-origin origin

4
Можно подтвердить, что это копирует всю историю и теги. Очень хорошо. Спасибо.
Алекс

Если у нового источника нет никаких коммитов, это работает хорошо. Однако, если есть какой-либо коммит в new-origin, упомянутый здесь способ не будет соответствовать ожидаемому.
около

вам нужно переключить git checkout BranchNameветки с помощью push push на удаленное репо, git push --all new-origin но большое спасибо
Raad Altaie

21

Если вы хотите сохранить существующие ветки и зафиксировать историю, вот один способ, который сработал для меня.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Теперь предположим, что вы хотите синхронизировать исходные и конечные репозитории в течение определенного периода времени. Например, в текущем удаленном репо все еще есть активность, которую вы хотите перенести в новое / замененное репо.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

Чтобы получить последние обновления (при условии, что у вас нет локальных изменений):

git checkout {branch(es) of interest}
git pull old
git push --all new

NB: Я еще не использовал субмодули, поэтому я не знаю, какие дополнительные шаги могут потребоваться, если они у вас есть.


1
Это сработало просто и легко для меня. Я думаю, что это должен быть проверенный ответ. Если у вас есть 60 филиалов, это путь.
rickfoosusa

7

Самый простой подход, если Git уже отслеживает код, а затем установить новый репозиторий в качестве «источника», на который нужно нажать.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

Это сработало, чтобы переместить мое локальное репо (включая историю) в мое удаленное репозиторий github.com. После создания нового пустого репо на GitHub.com я использую URL в шаге три ниже, и он прекрасно работает.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

Я нашел это по адресу: https://gist.github.com/niksumeiko/8972566


1
Это самый простой способ пустить оригинальный репозиторий. Также копирует все ветки.
Гильермо

1
Это также копирует все теги.
Ворон

2

Я использовал приведенный ниже метод для переноса моего GIT Stash в GitLab, поддерживая все ветви и историю коммитов.

Клонировать старый репозиторий в локальный.

git clone --bare <STASH-URL>

Создайте пустой репозиторий в GitLab.

git push --mirror <GitLab-URL>

1

Похоже, ты рядом. Предполагая, что это не просто опечатка в вашем представлении, шаг 3 должен быть cd repo2вместо repo1. И шаг 6 должен быть git pullне push. Переработанный список:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

Спасибо, Эрик, но на шаге 3 я хочу удалить ссылку на исходный репозиторий, чтобы избежать внесения каких-либо удаленных изменений ... так как я хочу переместить содержимое из repo1 в repo2.
Марио

Хорошо. Я отредактировал свой ответ, чтобы попытаться отразить это. Просто чтобы убедиться, что вы пытаетесь создать репозиторий, repo2, который является копией repo1, но не сохраняет ни repo1, ни origin в качестве удаленных?
Эрик Палас

Нет, я не пытаюсь сделать новый репо "repo2". На самом деле, у меня есть существующий repo2, который имеет другое содержимое init. Теперь я хочу переместить все содержимое repo1 в repo2 с историей. Я буду держать repo1 пустым, как это на сервере.
Марио

Вы думали не использовать git? Похоже, вы могли бы просто скопировать файлы (через графический интерфейс, scp или ftp) и вручную добавить их в репозиторий git. Это может быть не так эффективно, но, вероятно, проще.
Эрик Палас

Я уже пробовал это, но это оставило историю. Я хочу перенести всю свою историю.
Марио

1

Согласно ответу @ Dan-Cohn Mirror-push ваш друг здесь. Это мой путь для переноса репозиториев:

Зеркальное отображение хранилища

1 pen Open Git Bash.

2. Создайте голый клон хранилища.

$ git clone --bare https://github.com/exampleuser/old-repository.git

3. Зеркальное нажатие на новый репозиторий.

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4. Удалите временный локальный репозиторий, созданный на шаге 1.

$ cd ..
$ rm -rf old-repository.git

Ссылка и кредит: https://help.github.com/en/articles/duplicating-a-repository


-1

Здесь много сложных ответов; однако, если вас не интересует сохранение ветвей, все, что вам нужно сделать, - сбросить удаленный источник, установить восходящий поток и нажать.

Это помогло мне сохранить всю историю коммитов.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.