Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Git is een populaire opslagplaats voor gedistribueerde broncode (opslagplaats) waarmee gebruikers met de volledige opslagplaats kunnen werken terwijl de verbinding is verbroken. De voordelen van Git zijn goed gedocumenteerd, maar wat gebeurt er als u de klok wilt terugdraaien op de primaire opslagplaats? Dit is niet intuïtief en vereist verhoogde machtigingen. Deze vereiste wordt verwacht voor iets dat van invloed is op elke gebruiker van de opslagplaats.
Hoe kunt u de centrale repository veilig terugzetten?
Probleemscenario
Stel dat u een groot bestand, zoals een video, doorvoert op uw Git-server. In een traditioneel broncodesysteem is het handig om alles op één plek op te slaan en vervolgens op te halen wat u nodig hebt. Met Git wordt de hele opslagplaats gekloond naar de lokale computer van elke gebruiker. Met een groot bestand moet elke gebruiker in het project ook de grote bestanden downloaden.
Met elk volgend groot bestand dat is doorgevoerd op de server, neemt het probleem alleen toe. De opslagplaats wordt te groot om efficiënt te zijn voor de gebruikers. Zelfs als u het grote bestand verwijdert uit uw lokale opslagplaats en het opnieuw doet, bestaat het bestand nog steeds in de geschiedenis van de opslagplaats. Als gevolg hiervan wordt het bestand nog steeds gedownload naar de lokale computer van iedereen als onderdeel van de geschiedenis.
Voeg een groot bestand toe aan de lokale opslagplaats.
Nadat u een commit heeft uitgevoerd vanuit de lokale repository, heeft de server ook het grote bestand.
De opslagplaats bevriezen
Als u het probleem van een grote opslagplaats wilt oplossen, moet u beginnen bij de bron. In dit scenario is de bron de serveropslagplaats. Vraag het team om te stoppen met het uploaden naar de repository. Als er tijdens dit proces meer pushes worden uitgevoerd, moet u er rekening mee houden zodat u geen gegevens kwijtraakt.
Belangrijk
Met de volgende stappen verwijdert u de video uit uw vertakkingsgeschiedenis, maar blijft het bestand in uw opslagplaatsgeschiedenis wanneer u uw opslagplaats kloont uit Azure-opslagplaatsen. Als u de bestanden uit de vertakkingsgeschiedenis verwijdert, voorkomt u dat de bestanden worden bijgewerkt, waardoor een andere versie van het grote bestand in uw opslagplaats is gemaakt.
Meer informatie over het beheren van grote bestanden in Git. Voor een uitleg en tijdelijke oplossing voor dit gedrag wanneer u Azure Repos Git-opslagplaatsen gebruikt, raadpleegt u Waarom retourneert klonen van Visual Studio Team Services oude niet-verwijzende objecten?.
Opnieuwbase en geforceerd pushen
Als niemand anders in het team wijzigingen heeft aangebracht in de repository, die meestal via een push plaatsvinden, kunt u de makkelijke weg kiezen. In wezen zorgt u ervoor dat uw lokale opslagplaats eruitziet zoals u wilt dat deze eruitziet (dat wil gezegd, zonder het grote bestand). Vervolgens dwingt u uw wijzigingen af op de server.
Mogelijk moet u uw lokale repository klonen of repareren voordat u aan dit werk begint. Dit proces kan leiden tot verloren werk of wijzigingen, dus wees voorzichtig.
Standaard kunt u lokale projectbestanden wijzigen en wijzigingen naar de server pushen, maar u kunt geen bewerkingen op serverniveau uitvoeren, zoals verwijderen of opnieuw maken. Als u wilt doorgaan, hebt u Force push-machtigingen (de voorkeur) of beheerdersmachtigingen voor de repository nodig. Neem contact op met de projectbeheerder om deze machtigingen aan te vragen of vraag iemand die ze al heeft om te helpen. Zie Machtigingen voor Git-opslagplaatsen instellen voor meer informatie.
Vervolgens moet u de opslagplaats opnieuw maken.
Gebruik
git logom de hashwaarden van de Secure Hash Algorithm (SHA) van de meest recente commits te vinden. U hebt deze informatie op een gegeven moment nodig, omdat u de meest recente goede commit moet weten. U kunt deze informatie ophalen door een Git-opdrachtprompt te openen en het volgende in te voeren:git logU kunt de SHA-hash ook ophalen door de vertakkingsgeschiedenis in Visual Studio Team Explorer te bekijken.
Open een Git-opdrachtprompt.
Zoek het sha-hashnummer van belang.
U hebt de SHA nodig die begint
25b4.Houd er rekening mee dat Git pointers gebruikt om te bepalen waar zich in de opslagplaats de hoofd- of huidige vertakking bevindt. De toestand van de repository waarin u geïnteresseerd bent bevindt zich op een bepaald moment in het verleden.
Gebruik de
git rebaseopdracht om terug te gaan in de tijd en de vorige status de nieuwe huidige status te geven:git rebase -i <SHA hash of desired new current branch>
De
-ischakelaar biedt extra veiligheid omdat deze de geschiedenis in een editor weergeeft. (In dit artikel wordt een implementatie van Git gebruikt waarmee de klassieke vi-editor op de opdrachtregel in Windows wordt weergegeven. U weet het misschien nog als u met een Unix-systeem hebt gewerkt.)In dit voorbeeld voert u het volgende in:
git rebase -i 25b4Nadat de editor is geopend, verwijdert u alle
pickregels, met uitzondering van de vertakking die u wilt behouden als uw nieuwe hoofdvertakking. Wanneer alles er correct uitziet, voer in vi:w\<enter\>in om op te slaan of voer!q\<enter\>in om af te sluiten zonder op te slaan.
Wijzig de lijnen die u niet meer wilt.
Verander
picknaardropzoals weergegeven. Voer:wvervolgens (in vi) in om op te slaan en voer in:q!om de rebase te starten.Voer nu opnieuw in
git log. De problematische vertakking moet afwezig zijn in het log. Als dat het is, bent u klaar voor de laatste stap, waarvoor projectbeheerdersmachtigingen zijn vereist:git log
De commit voor de grote video is nu verwijderd uit de lokale repository.
Voer de volgende opdracht in:
git push --force
Met dit commando wordt uw repository gedwongen om de repository op de server te overschrijven.
Gebruik deze opdracht met voorzichtigheid omdat u eenvoudig gegevens op de server kunt verliezen.
U moet zich verifiëren bij de server om deze actie te laten werken.
Als je Azure Repos gebruikt, moet je mogelijk een alternatieve referentie instellen zonder speciale tekens. Een voorbeeld is het at-symbool (@) in een e-mailadres. Volg de instructies in Authentication with Azure Repos om deze taak uit te voeren.
De tak is nu definitief van de server verwijderd. Volgende klonen en synchronisaties door projectteamleden downloaden niet de grote bestanden die u probeerde te verwijderen. Gebruikers moeten van de server naar beneden trekken om ervoor te zorgen dat ze gesynchroniseerd zijn met de status van de nieuwe serveropslagplaats.
Als gebruikers nieuwere commits hebben
Als andere gebruikers commits naar het serverrepository hebben gepusht, moet u een andere factor overwegen. U wilt de vertakking met de grote bestanden verwijderen, maar u wilt de wijzigingen die het team heeft aangebracht niet verliezen. Als u deze situatie wilt oplossen, moet u goed naar de commits kijken wanneer u de editor opent als onderdeel van het rebasing. Zorg ervoor dat de commits die u wilt behouden op de pick regels vermeld worden. Verwijder de bestanden die u wilt verwijderen, bijvoorbeeld waar een groot bestand is toegevoegd.
Na het rebasen moeten de andere gebruikers in het team ook rebasen, zodat iedereen een consistente kopie van de server-repo heeft. Dit werk is vervelend voor iedereen en je wilt het vermijden. Als u een push moet verwijderen, moet u dit afstemmen met het team. Voor meer informatie over rebasing, zie Git-branching - Rebasing.
De sleutel is om ervoor te zorgen dat u de commits kent die u wilt en de commits die u niet wilt. Onderzoek de git log of de historie in uw geïntegreerde ontwikkelomgeving (zoals Visual Studio). Noteer de SHA-hashes die u wilt behouden en de hashes die u wilt verwijderen.
In scenario's waarin het grote bestand oud is en er volgende vertakkingen en samenvoegingen waren, kunt u het bestand mogelijk verwijderen met behulp van de git filter-branch schakeloptie. Zie Gevoelige gegevens verwijderen uit een opslagplaats voor meer informatie.
Overwegingen voor beste praktijken
Zorg ervoor dat grote bestanden buiten de hoofdrepo blijven om teamleden extra werk te besparen. Hier volgen enkele algemene aanbevolen procedures voor het team om rekening mee te houden.
Wat u moet doen
- Wijzigingen regelmatig doorvoeren. Je kunt ze later altijd herstellen door te squashen of te rebasen.
- Gebruik vertakkingen om uw wijzigingen te isoleren. Branches zijn goedkoop en privé en samenvoegen is eenvoudig. U kunt ook een back-up maken van wijzigingen in een vertakking door deze naar de server te pushen.
- Gebruik een naamgevingsconventie bij het publiceren van onderwerptakken. Geef de branch een naam
users/<alias>/<branchname>. Deze naam helpt bij het groeperen van uw takken en maakt het gemakkelijk voor anderen om de eigenaar te identificeren. - Vergeet niet om uw wijzigingen te pushen. Gebruiken
Commit != Checkinen(Commit + Push) == Checkin. - Overweeg het gebruik
.gitignorevoor grote binaire bestanden, zodat ze niet worden toegevoegd aan de opslagplaats. Zie Bestanden negeren voor meer informatie. - Overweeg nuGet- of Team Foundation Server-versiebeheer te gebruiken om uw grote binaire bestanden op te slaan.
Dingen die moeten worden vermeden
- Rebase niet nadat je hebt gepusht. Het rebasen van gepushte commits in Git kan slecht zijn, omdat iedereen in de opslagplaats hun lokale wijzigingen opnieuw moet rebasen. Teamleden zijn mogelijk niet tevreden als ze deze taak moeten uitvoeren. Het opnieuw maken van gepushte doorvoeringen op uw eigen persoonlijke vertakking, zelfs als ze worden gepusht, is geen probleem, tenzij anderen deze doorvoeringen ophalen.
- Voer geen binaire bestanden door naar uw opslagplaats. Git comprimeert binaire bestanden niet op de manier die Team Foundation-versiebeheer doet. Omdat alle repositories de volledige geschiedenis hebben, betekent het doorvoeren van binaire bestanden een permanente toename van opslagruimte.
Samenvatting
Soms worden ongewenste elementen, zoals grote bestanden, toegevoegd aan een opslagplaats en moeten ze worden verwijderd om de opslagplaats schoon en licht te houden. U kunt deze taak uitvoeren door uw lokale repository gereed te maken. Gebruik de git rebase opdracht en gebruik vervolgens de git push --force opdracht om de serveropslagplaats te overschrijven met uw lokale opslagplaats.