Mergeți depozitele în git

Există două depozite. Sarcina este de a le îmbina, astfel încât fișierele dintr-un depozit să intre în dosarul celuilalt și să păstreze întreaga istorie.

Nu am găsit în rețea o descriere completă a tuturor pașilor (poate că nu l-am căutat) și, prin urmare, am decis să completez un memo compilat din diferite surse și propriile mele experimente.







Esența problemei

Să presupunem că avem două proiecte, fiecare dintre care trăiește într-un depozit separat.

Să numim primul proiect libfoo. Este o bibliotecă arhipelagică cu o istorie lungă și distinsă.

Există o mulțime de fișiere, care sunt foarte importante pentru noi.

Cel de-al doilea proiect este proiectul principal, criminalul Facebook, Twitter și (brusc) Wikipedia.

El este, de asemenea, foarte mare

După trei ani de dezvoltare, am realizat că este foarte important pentru noi să fuzionăm ambele depozite într-una. Și anume, mutați biblioteca în depozitul de proiecte (în noul folder libfoo). Desigur, în același timp, vreau să salvez întreaga istorie a schimbărilor.

act de renunțare

În această intrare, fac toate modificările chiar în depozitele propriu-zise. Dar, atunci când lucrați cu depozite reale, vă recomand să efectuați astfel de manipulări numai cu copii ale depozitelor. În ciuda faptului că git în majoritatea cazurilor încearcă să salveze datele utilizatorilor, unele dintre comenzile pe care le folosim pot dezinstala conținutul depozitului fără a lăsa urme.

Prin urmare, efectuați toate experimentele pe copii ale depozitelor de lucru. În plus, clonele în git sunt create foarte repede. Și când toate manipulările sunt finalizate, depozitele pot fi sincronizate prin push / pull.

În general, cred că te-am avertizat. Aveți grijă de datele dvs.!

Rescrie calea către fișiere

Primul pas spre îmbinarea depozitelor în ecstasy dulce este de a schimba calea către fișierele din depozit cu biblioteca. Dacă fișierele sunt acum în rădăcină, atunci după manipulările noastre ar trebui să treacă la folderul libfoo (care va fi localizat în depozitul libfoo).







Comanda filtru-ramură termonucleară git ne va ajuta să realizăm acest lucru. Este destinat editării active a istoriei în spiritul "1984". Istoria se schimbă direct printr-o schimbare (mai precis, re-crearea) de comitete, astfel încât toate editările sunt ireversibile. O aplicație nereușită a ramurii filtrului poate trimite magazia dvs. la un depozit.

Deci, urmăriți-vă cu atenție mâinile:

Parametrul - filter -tree spune git că următoarea comandă trebuie aplicată fiecărui comitet din lanț (în acest caz, pentru întreaga ramură principală). Filtrarea va reuși numai dacă comanda se termină cu o stare de 0 și toate comitetele pot fi suprapuse.

Echipa de coajă în sine are de asemenea două părți. Mai întâi vom crea dosarul libfoo. Apoi mutăm toate fișierele la el, cu excepția libfo-ului însuși. Un exemplu tipic al puterii coajelor: cu ajutorul unei țevi și a mamei cuiva facem o acțiune complexă din partea comenzilor de bază, ceea ce va face pentru om toată munca monotonă.

Dacă nu am făcut o greșeală în tastarea comenzii, git va rescrie toate comitetele repository și ne va arăta noua bibliotecă îmbunătățită libfoo:

În același timp, întreaga istorie a schimbărilor va fi păstrată (deși, bineînțeles, se vor schimba hași de comitete):

Dacă doriți, puteți să vă conectați la un anumit fișier și să vă asigurați că istoricul său este, de asemenea, în regulă.

Acum o poți face singur.

Merge Depozitele

Sunt foarte puțini rămași. Mergem la principalul proiect uberproject și eliminăm toate comitetele din depozitul schimbat de bibliotecă:

git va fi surprins de faptul că magazia de la distanță nu are comitetele noastre comune și ne va avertiza în legătură cu aceasta. Nu vă faceți griji - totul merge conform planului.

Cu toate acestea, planul în sine depinde de modul în care doriți să îmbinați cele două ramuri. Depinde, în principiu, de politica de gestionare a filialelor în depozitul adoptat în echipa dvs.

Puteți merge pe drumul Linus și puteți îmbina cele două ramuri printr-o îmbinare obișnuită. În acest caz, va fi creat un comitet, care va avea doi strămoși: unul de libfoo și unul din principalul proiect:

Există o altă opțiune. De exemplu, noi, pe proiectul nostru de lucru, am interzis comiterea cu mai mulți părinți (de dragul unei simple istorii liniare de comitete). În acest caz, trebuie să fuzionați ramurile prin rebază.

Și, în orice caz, nu uitați să curățați depozitul de la distanță - nu mai avem nevoie de el!

Ce în final

Am obținut ceea ce ne-am dorit: în depozitul principal de proiect a existat un dosar numit libfoo cu toate fișierele din proiectul libfoo (sper că ați vrut cu adevărat acest lucru!)

Morala întregii fabule: rescrie istoria și ordonează depozitele de sănătate, dar nu uitați:

Mergeți depozitele în git

Mergeți depozitele în git







Articole similare

Trimiteți-le prietenilor: