Hoe dwing ik git pull om alles bij elke pull te overschrijven?

Ik heb een CENTRALE kale repository met drie ontwikkelaarsrepository’s die er normaal naartoe trekken en pushen.

Ik heb ook twee andere repositories die uit de CENTRALE kale repo halen: de ene is de live-server en de andere is een test/stage-server, die elk uit zijn eigen respectievelijke vertakking trekken.

Het scenario is dit: ik heb een post-updatehook-script op de CENTRAL-repo die automatisch toegang heeft tot de test- en live-repo’s en op elk een pull-opdracht uitvoert. Dit werkt zowel test- als liveservers bij, allemaal afhankelijk van welke branch nieuwe commits heeft. Dit werkt allemaal prima.

Het probleem is dit: in een noodgeval kunnen bestanden direct op de server worden bijgewerkt (via ftp of wat dan ook) en het CENTRAL post-update script zal dan mislukken omdat er samenvoeg-/overschrijfconflicten zullen optreden. Er is geen manier om dit scenario te vermijden, en het is onvermijdelijk.

Wat ik zou willen dat er gebeurt, is dit: ik wil dat de pull van de live- en testsites altijdwordt overschreven/samengevoegd bij pull. Altijd.Deze repo’s zijn alleen pull-only, omdat ze niet voor ontwikkeling zijn.

In al mijn onderzoek kan ik geen goede oplossing vinden om een ​​pull altijdeen overschrijving van de lokale bestanden te forceren. Is dit überhaupt mogelijk? Als dat zo is, zou het een geweldig ontwikkelingsscenario zijn.


Antwoord 1, autoriteit 100%

De ideale manier om dit te doen is om pullhelemaal niet te gebruiken, maar in plaats daarvan fetchen reset:

git fetch origin master
git reset --hard FETCH_HEAD
git clean -df

(Wijzigen van masterin de branch die je wilt volgen.)

pullis ontworpen om wijzigingen op de een of andere manier samen te voegen, terwijl resetis ontworpen om uw lokale kopie eenvoudigweg te laten overeenkomen met een specifieke vastlegging.

Misschien wilt u iets andere opties overwegen om clean, afhankelijk van de behoeften van uw systeem.


Antwoord 2, autoriteit 4%

Je zou dit kunnen proberen:

git reset --hard HEAD
git pull

(from Hoe dwing ik “git pull” om lokaal te overschrijven bestanden?)

Een ander idee zou zijn om de hele git te verwijderen en een nieuwe kloon te maken.


Antwoord 3

Ik weet niet zeker hoe ik het in één commando moet doen, maar je zou zoiets kunnen doen als:

git reset --hard
git pull

of zelfs

git stash
git pull

Antwoord 4

git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch

Antwoord 5

Om een ​​kopie van de branch te halen en force overwrite van lokale bestandenvan de oorsprong te gebruiken:

git reset --hard origin/current_branch

Al het huidige werk gaat verloren en het zal dan hetzelfde zijn als de oorspronkelijke vertakking


Antwoord 6

Je kunt de haak verwisselen om alles schoon te vegen.

# Danger! Wipes local data!
# Remove all local changes to tracked files
git reset --hard HEAD
# Remove all untracked files and directories
git clean -dfx
git pull ...

Antwoord 7

Als je de lokale wijzigingen nog niet hebt doorgevoerd sinds de laatste pull/kloon, kun je het volgende gebruiken:

git checkout *
git pull

checkoutzal uw lokale wijzigingen wissen met de laatste lokale vastlegging, en
pullzal het sincroniseren naar de externe repository

Other episodes