Nous avons un dépôt git distant que nous déployons normalement en utilisant git Push
sur notre serveur de développement puis git pull
on sur nos serveurs live pour obtenir la dernière version poussée du repo.
Mais si nous avons commis et poussé quelques révisions (sans git pull
sur les serveurs en direct) comment pouvons-nous faire git pull
qui fait référence à l'ancien commit que nous voulons?
c'est-à-dire quelque chose comme git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4
Une fois que vous avez extrait le référentiel, vous devriez pouvoir aller:
git checkout 3ef0d...
uploadpack.allowReachableSHA1InWant
Puisque Git 2.5. cette variable de configuration peut être activée sur le serveur, voici GitHub feature request et GitHub commit enable this feature .
Bitbucket Server l'a activé depuis la version 5.5 + .
Usage:
# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
touch "$i"
git add "$i"
git commit -m "$i"
done
# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"
# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch Origin "$SHA3"
# Error.
git checkout "$SHA3"
# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true
# Now it works.
cd ../local
git fetch Origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"
Si un processus sur votre serveur en direct accède immédiatement au contenu que vous venez de tirer (c'est-à-dire que vous ne pouvez pas travailler avec git checkout 3ef0d
après l'extraction), vous devriez envisager de baliser la version que vous souhaitez déployer en production et en particulier extraire cette balise en production, afin que l'extraction ne change pas immédiatement votre répertoire de travail. Sinon, vous risqueriez que quelqu'un pousse juste avant votre tirage.
Notez qu'un git pull git checkout my-old-commit
vous laisse maintenant dans un état DÉTACHÉ HEAD - en fait, vous envoyez de futures validations dans ce référentiel sur un nouveau chemin de validation. Pour un dépôt de déploiement, ce n'est pas un problème majeur, car le seul les commits doivent être ceux déjà validés correctement avant d'être tirés.
Cependant, il est parfois utile de vérifier que les marqueurs de validation (tête, balises, télécommandes) sont identiques au référentiel maître. Pour résoudre ce problème après votre paiement: git reset
- rattache la tête git fetch
- synchronise les marqueurs pour les télécommandes [cela peut dépendre de la version de git - certes notre environnement est toujours sur 1.7 ... donc peut-être plus nécessaire YMMV]