Переміщення вмісту сховища Git до іншого сховища із збереженням історії


141

Я намагаюся перемістити лише вміст одного сховища ( repo1) до іншого наявного сховища ( repo2), використовуючи наступні команди:

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

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


Чи хочете ви, щоб вміст repo1 був гілкою на repo2 або як частина головного, щоб папки обох репостів співіснували у вашому робочому режимі?
Хронічний

Я хочу перенести це як частина майстра.
Маріо

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, а також буде історія обох.


Дякую Хроніаль, я просто хочу переконатися, що у repo1 також є одна гілка, і що, якщо я хочу перенести цю гілку також на repo2?
Маріо

добре, чи у repo2 також є друга гілка? Або що має статися з цією галуззю?
Хронічний

1
Хронічний, вищезгадані товариші не спрацювали! він не скопіював історію.
Маріо

1
Гаразд, зараз це спрацювало. Я використав таку команду; cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda Найпростішим рішенням буде просто перенести все всередину repo1у підпапку (всередину repo1), перш ніж робити злиття.
Хронічний

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

Тепер ми готові перенести всі локальні гілки та теги до нового віддаленого імені нового походження:

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

Давайте зробимо нове походження за замовчуванням:

git remote rm origin

Перейменуйте нове джерело лише на походження, щоб воно стало віддаленим за замовчуванням:

git remote rename new-origin origin

4
Можна підтвердити, що це копіює всю історію та теги. Дуже хороша. Дякую.
Олексій

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

вам потрібно перемикати git checkout BranchNameгілки, а потім знову відштовхнути гілку до віддаленого репо, git push --all new-origin але велике спасибі
Раад Алтай,

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

Схоже, ти поруч. Припускаючи, що це не лише помилка cd repo2друку в поданні, крок 3 повинен бути замість repo1. І крок 6 не повинен бути git pullнаполегливим. Перероблений список:

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, ні походження як віддалені?
Ерік Палац

Ні, я не намагаюся зробити нове репо "repo2". Насправді, у мене є вже існуючий репо2, в якому є інший вміст. Тепер я хочу перемістити весь вміст repo1 в repo2 з історією. Я буду тримати репо1 порожнім, як це є на сервері.
Маріо

Ви думали не використовувати git? Здається, ви, ймовірно, можете просто скопіювати файли (через gui або scp чи ftp) та додати їх вручну до git repo. Це може бути не настільки ефективно, але, ймовірно, простіше.
Ерік Палац

Я вже спробував це, але це залишило історію. Я хочу також перенести всю його історію.
Маріо

1

Відповідно до @ Dan-Cohn відповіді, дзеркальний поштовх тут ваш друг. Це мій шлях до міграції репостів:

Дзеркальне відображення сховища

1. Відкрийте 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.