ПредишенСледващото

Има две хранилища. Задачата - да ги обедините, така че на файлове от един хранилище влязоха в една папка в друга, и в същото време да запази цялата история.

Не намерих в пълно описание на всички стъпки на мрежата (може би изглеждат зле), и затова реших да се запълни бележката, съставени от различни източници и собствените си експерименти.

Същността на проблема

Да кажем, че имаме два проекта, всеки от които живее в отделна хранилище.

Нека да свика първото libfoo проекта. Това е изключително полезно, библиотека с дълга и забележителна история.

Тя е пълна с файлове, всички от които са много важни за нас.

Вторият проект - един mainproject, Facebook убиец, Twitter и (изведнъж) Уикипедия.

Той също е много високо

И след три години на развитие, ние осъзнахме, че и двамата сме жизнено важно да се слеят в едно хранилище. А именно, да се премести на библиотеката в хранилището на проекта (libfoo нова папка). Разбира се, в същото време искат да запазят цялата история на промените.

опровержение

В този пост прекарат всички промени директно в самите хранилища. Но когато става дума за реални хранилища, аз силно препоръчвам да се извършват такива манипулации само с копия на вашите транзакции. Въпреки факта, че в повечето случаи Git се опитва да спаси потребителски данни, някои от командите, които използваме, са в състояние да се отстрани напълно съдържанието на хранилището.

Ето защо, прекарват всички експерименти върху копия на работни хранилища. Особено, защото в Git клонинг създаден много бързо. И когато всички манипулации са завършени, хранилището може да се синхронизира чрез натискане / издърпване.

Като цяло, аз вярвам, че те предупредих. Защитете вашите данни!

Препишете пътя до файловете

Първата стъпка към обединяване на хранилищата в сладък екстаз - промяна в начина, по файлове в хранилището с библиотеката. Ако сега файловете са в основата на нашия след манипулация те трябва да се премести в libfoo папка (който се намира вътре libfoo хранилище).

За да се постигне това, ще помогне на отбора сливане Git филтър-бранша. Той е предназначен за активните редактиране истории в духа на "1984". промени История директно чрез промяна (или по-скоро, пресъздаване) извърши, така че всички промени са необратими. Ако не използвате филтър-клон може да изпратите вашето хранилище в депо.

Затова внимавайте добре за ръце:

Flag --tree-филтър команда Git-в, следващият отбор зад него трябва да се прилага за всеки ангажимент във веригата (в този случай за целия бранш майстор). Филтрирането ще бъде успешен само когато командните изходи със статут на 0 и всички ангажира успява да се наложи.

Самият екип също е обвивка се състои от две части. На първо място, ние създаваме libfoo папка. След това преместете всички файлове, с изключение на libfoo. Типичен пример за силата на черупка: С помощта на тръбата и нечия майка се състои от основни команди комплексното действие, което ще направи един човек всичко монотонна работа.

Ако не направите грешка при въвеждането команда, Git ангажират ще презапише всички хранилището, и ние ще се разкрие нов, подобрен библиотека libfoo:

Това спестява цялата история на промените (въпреки че, разбира се, ще се промени хешовете на ангажира)

Ако желаете, можете да хвърли дневник Git за всеки отделен файл и се уверете, че историята му е наред.

Сега можете да направите и от сливането.

слеят хранилища

Има много малко. Ние се обръщаме към нашия uberproekt mainproject и издърпайте всички ангажира от модифициран хранилище библиотеката:

Git ще се учудите, че дистанционното хранилището не е общите ни ангажира и да ни предупреди за това. Не се притеснявайте - всичко върви по план.

Планът обаче зависи от това, как искате да се слеят две разклонения. Това зависи главно от приетата в своите клонове на политиката за управление на екипа в хранилището.

Можете да отидете на Linus-пътя и да се слеят две разклонения в рамките на нормалното за обединяване. В този случай, той създава се ангажират, което ще има две предци, единият от libfoo, и един от MainProject:

Има и друг вариант. Например, ние работим за вашия проект, извършва забранена от няколко родители (в името на една проста линейна история на ангажира). В този случай, е необходимо да се слеят клонове в цялата rebase.

И в никакъв случай не забравяйте да почистите дистанционното хранилището - това е, че ние вече не е необходимо!

В резултат на което

Имаме това, което искат: (! Надявам се, че наистина го харесва, че) в mainproject хранилище папка се появява libfoo с всички файлове на libfoo на проекта

Поуката от баснята: пренапише историята си и да организира хранилището върху здравето, но не забравяйте:

Сливане на хранилища за Git

Сливане на хранилища за Git

Свързани статии

Подкрепете проекта - споделете линка, благодаря!