web-dev-qa-db-fra.com

git fetch révision spécifique du référentiel distant

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

57
dlrust

Une fois que vous avez extrait le référentiel, vous devriez pouvoir aller:

git checkout 3ef0d...
68
Scott Muc

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.

2
Olaf

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]

1
simon coleman