J'ai un référentiel nu CENTRAL qui a trois référentiels de développeurs tirant et poussant normalement.
J'ai également deux autres référentiels qui tirent du référentiel nu CENTRAL: l'un est le serveur en direct, et l'autre est un serveur de test / stage - chacun tirant de sa propre branche respective.
Le scénario est le suivant: j'ai un post-update
script de hook sur le référentiel CENTRAL qui accède automatiquement aux repos de test et live et exécute une commande pull sur chacun. Cela met à jour les serveurs de test et les serveurs en direct, tous 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 en cas d'urgence que les fichiers soient directement mis à jour sur le serveur (via ftp ou autre) et le script de post-mise à jour CENTRAL échouera alors car des conflits de fusion / écrasement se produiront. Il n'y a aucun moyen d'éviter ce scénario, et c'est inévitable.
Ce que j'aimerais qu'il se passe, c'est ceci: je veux que le pull des sites en direct et de test écrase / fusionne toujours au pull. Toujours. Ces référentiels seront à extraction uniquement car ils ne sont pas destinés au développement.
Dans toutes mes recherches, je ne trouve pas de bonne solution pour qu'un pull force toujours un écrasement des fichiers locaux. Est-ce possible? Si tel était le cas, cela constituerait un excellent scénario de développement.
Réponses:
Vraiment, le moyen idéal de le faire est de ne pas utiliser
pull
du tout, mais plutôtfetch
etreset
:(Modification
master
de la branche que vous souhaitez suivre.)pull
est conçu autour de la fusion des modifications d'une manière ou d'une autre, alors qu'ilreset
consiste simplement à faire correspondre votre copie locale à un commit spécifique.Vous pouvez envisager des options légèrement différentes
clean
selon les besoins de votre système.la source
reset --hard
est une commande qui est utilisée pour forcer l'état du répertoire de travail (et de la branche courante) à un état correspondant à celui d'un commit particulier.FETCH_HEAD
est une référence qui est automatiquement créée parfetch
pour représenter la référence récupérée. Ce n'est pas fusionné, juste écrasé directement chaque fois que vous effectuez une extraction.clean
est une commande qui supprime les fichiers qui ne sont pas suivis pargit
, les-df
indicateurs lui indiquent de supprimer les répertoires (-d
) et de faire la suppression (-f
).git clean -dn
avant d'utilisergit clean -df
afin de voir quels fichiers / dossiers seront supprimés.git clean -df
ne peut être inversé que si vous aviez une sauvegardegit clean -df
supprimer également les fichiers gitignored, mais il s'avère que non.git clean --help
indique "Normalement, seuls les fichiers inconnus de Git sont supprimés, mais si l'option -x est spécifiée, les fichiers ignorés sont également supprimés. Cela peut, par exemple, être utile pour supprimer tous les produits de génération."Vous pouvez essayer ceci:
(dans Comment puis-je forcer "git pull" à écraser les fichiers locaux? )
Une autre idée serait de supprimer l'intégralité de git et de créer un nouveau clone.
la source
Je ne sais pas comment le faire dans une seule commande mais vous pourriez faire quelque chose comme:
ou même
la source
git reset --hard && git pull
. Sinon, mais pas mieux,git reset --hard; git pull
. L'utilisation&&
exécutera la deuxième commande uniquement si la première commande a réussi.;
l'exécutera quel que soit le code de sortie de la première commande.Pour extraire une copie de la branche et forcer l'écrasement des fichiers locaux depuis l'origine, utilisez:
Tout le travail en cours sera perdu et ce sera alors le même que la branche d'origine
la source
la source
Vous pouvez changer le crochet pour tout nettoyer.
la source
git clean
est déjà "Supprimer les fichiers non suivis de l'arborescence de travail" (haut de la page). Normalement, cela n'inclut pas les fichiers ignorés, mais-x
indiquegit clean
d'inclure également les fichiers ignorés (sauf que cela n'affecte pas les fichiers ignorés par l'-e
option).Si vous n'avez pas encore validé les modifications locales depuis le dernier pull / clone, vous pouvez utiliser:
checkout
effacera vos modifications locales avec le dernier commit local etpull
le synchronisera vers le référentiel distantla source