Udviklingen af den distribuerede versionskontrolsystem Git 2.56 er blevet præsenteret. Koden til Git distribueres under GPLv2+ licensen. I forhold til den tidligere version er der foretaget 748 ændringer, udført af 104 udviklere, hvoraf 39 deltager i udviklingen af Git for første gang. De vigtigste nyheder (1, 2, 3):
- Der er tilføjet en "git add --resolved"-tilstand til at løse konflikter ved sammensmeltning af grene, der kontrollerer filer for konflikte markører og, hvis en markør findes i en fil, returnerer en fejl, indekserer ingen filer og viser en liste over filer, der skal rettes. I modsætning til kommandoen "git add --update" behandler den nye tilstand kun filer i konflikt, mens ændrede filer, der ikke er relateret til konflikten, ignoreres. Dette muliggør en sikker afslutning på grenesammensmeltninger, selvom der er andre uafsluttede ændringer i arbejdsbiblioteket ("git add --update" tilføjede alle tidligere sporede ændrede filer i arbejdsbiblioteket til indekset).
- Arbejdet med store repositories er betydeligt accelereret ved at optimere algoritmen til at finde de seneste fælles commits under sammensmeltning af grene og sammenligning af commits. Under arbejdet tages der nu hensyn til commits, der kun tilhører en af grenene, hvilket muliggør at stoppe scanningen umiddelbart efter opdagelsen af alle mulige fælles forfædre, uden at spilde tid på videre gennemgang af ændringshistorikken. Hastigheden for søgning i et af de testede repositories blev i gennemsnit 20 gange hurtigere, mens acceleration i et andet nåede op på 70 gange. Ved udførelsen af kommandoen "git merge-base --all v4.8 v4.9" i et repository med Linux-kernen blev antallet af gennemgangstrin reduceret fra 167.000 til 3.800.
- For serverbrug er tilstanden til repackning "--path-walk" tilpasset, hvilket muliggør oprettelse af mere kompakte pack-filer ved at gruppere objekter efter deres sti i katalogtræet (for eksempel for repositoryet Fluent UI gjorde brugen af "--path-walk" det muligt at reducere størrelsen af pack-filen fra 558 MB til 164 MB). I den nye version er der implementeret mulighed for at bruge "--path-walk" sammen med tilgængelighedsbidrag (reachability bitmap) og delta-øer (delta island), som anvendes af git-hosting til at accelerere arbejdet og isolere forks fra det primære repository.
- Flaskehalsene, der førte til overdreven beregning i store depot, er blevet rettet: unødvendige tilstandscheck af filer ved skrivning til reftable er fjernet; tilbage-scanning af listen ved hver indsættelse af en ny pack-fil er udelukket; operationer med reftable, der har et stort antal sletningsposter, er blevet hurtigere; arbejdet med 'git diff', når der er angivet begrænsninger for filstier, er optimeret. Efter optimeringerne er arbejdet med reftable, når der er mange sletninger, blevet 65 gange hurtigere (fra 13 sekunder til 0,2 sekunder), og udførelsen af den problematiske kommando 'git diff' i depotet Chromium med 500000 elementer i indekset tager nu 0,07 sekunder i stedet for 8 minutter.
- Den eksperimentelle kommando 'git history', der giver muligheder for at omskrive ændringshistorik, har fået operationen 'git history drop' til at fjerne et valgt commit med automatisk tilknytning af dets efterkommere til den forældrelige commit.
- Kommandoen 'git branch —delete-merged ‘origin/*’ ‘topic-*'’ er blevet tilføjet for sikker fjernelse af grupper af lokale grene, hvis ændringer allerede er sendt til et eksternt depot. Der tillades brug af masker til filtrering af grene og depoter. For at analysere kandidater til sletning, uden faktisk at udføre operationen, kan flaget '—dry-run' bruges.
- Kommandoen 'git refs create|update|delete|rename' er blevet tilføjet, som samler lavniveauoperationer til oprettelse, sletning, omdøbning og opdatering af referencer.
- Kommandoen 'git bisect run' har fået tilføjet optionen '—reset-when-found=[]', som automatisk returnerer depotet til tilstanden før søgen eller holder den problematiske commit aktiv, uden at det er nødvendigt at køre kommandoen 'git bisect reset' separat.
- Flaget '—linearize' er blevet tilføjet til kommandoen 'git replay' for at anvende flad topologi ved sammensmeltning, svarende til 'git rebase —no-rebase-merges', men uden at blive opmærksom på arbejdsområdet.
- I kommandoen 'git log —follow' er der implementeret overvågning af omdøbning af filer i ikke-lineær ændringshistorik, for eksempel ved sammensmeltning af undergrene. Stien til filen bliver nu registreret separat for hver forældrelig commit, hvilket gør resultatet uafhængigt af rækkefølgen af gennemgangen af commit-historien.
- Muligheden for at anvende kommandoen «git repack -a —filter=blob:limit=1m —drop-filtered» er tilføjet for at fjerne store blob-objekter, der er blevet hentet on demand fra eksterne repository og ikke bruges i det nuværende index. Når du tilgår disse objekter fremadrettet, vil de automatisk blive hentet igen.
- I kommandoen «git log —graph» er der implementeret indrykninger for grafer med flere uafhængige rødder, hvilket tydeliggør adskillelsen af urelaterede commits.
- Der er sikret identifikation af typiske tastefejl, såsom at angive «git push origin/main» i stedet for «git push origin main» eller «git branch —set-upstream-to origin main» i stedet for «git branch —set-upstream-to=origin/main», samt en vejledning til den korrekte brug.
Kilde: opennet.ru
