J'ai un référentiel nu CENTRAL qui a trois référentiels de développeurs qui s'y attirent et qui y poussent normalement.
J'ai également deux autres référentiels tirés du référentiel nu de CENTRAL: l'un est le serveur actif et l'autre est un serveur de test/étape, chacun extrait de sa propre branche respective.
Le scénario est le suivant: j'ai un script de raccordement _post-update
_ sur le dépôt CENTRAL qui accède automatiquement au test et aux mises en pension et exécute une commande d'extraction sur chacun d'eux. Cela met à jour les serveurs de test et les serveurs en direct, en fonction de la branche qui a de nouveaux commits. Tout cela fonctionne très bien.
Le problème est le suivant: il peut arriver que, dans une situation d'urgence, des fichiers soient mis à jour directement sur le serveur (via ftp ou autre) et que le script de post-mise à jour de CENTRAL échoue, car des conflits de fusion/écrasement se produisent. Il n’ya aucun moyen d’éviter ce scénario et c’est inévitable.
Ce que j'aimerais que cela se produise est le suivant: je veux que l’attraction des sites en direct et des sites d’essai soit toujours écrasante/fusionnée lors de l'extraction. Toujours. Ces dépôts seront collectés uniquement car ils ne sont pas destinés au développement.
Dans toutes mes recherches, je ne peux pas trouver une bonne solution pour avoir un pull toujours forcer un écrasement des fichiers locaux. Est-ce possible? Si tel était le cas, cela constituerait un excellent scénario de développement.
En réalité, le moyen idéal de le faire est de ne pas utiliser du tout pull
, mais plutôt fetch
et reset
:
git fetch Origin master
git reset --hard FETCH_HEAD
git clean -df
(Modification de master
sur la branche que vous souhaitez suivre.)
pull
est conçu de manière à fusionner les modifications, alors que reset
consiste simplement à faire en sorte que votre copie locale corresponde à un commit spécifique.
Vous pouvez envisager des options légèrement différentes de clean
en fonction des besoins de votre système.
Vous pouvez essayer ceci:
git reset --hard HEAD
git pull
(de Comment forcer "git pull" à écraser les fichiers locaux? )
Une autre idée serait de supprimer tout le git et de créer un nouveau clone.
Je ne sais pas comment le faire en une seule commande, mais vous pouvez faire quelque chose comme:
git reset --hard
git pull
ou même
git stash
git pull
git reset --hard HEAD
git fetch --all
git reset --hard Origin/your_branch
Pour extraire une copie de la branche et forcer l’écrasement des fichiers locaux à partir de l’origine, utilisez:
git reset --hard Origin/current_branch
Tous les travaux en cours seront perdus et seront alors identiques à ceux de la branche Origin.
Vous pouvez changer le crochet pour tout nettoyer.
# 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 ...
Si vous n'avez pas encore validé les modifications locales depuis le dernier pull/clone, vous pouvez utiliser:
git checkout *
git pull
checkout
effacera vos modifications locales avec le dernier commit local, et pull
le synchronisera dans le référentiel distant