66 votes

git récupère une révision spécifique du dépôt distant

Nous avons un dépôt git distant à partir duquel nous effectuons normalement le déploiement en utilisant git push sur notre serveur de développement, puis git pull sur nos serveurs live pour obtenir la dernière version poussée du repo.

Mais si nous avons engagé et poussé quelques révisions (sans une git pull sur les serveurs en direct) comment faire un git pull qui fait référence à l'ancien commit que nous voulons ?

c'est-à-dire quelque chose comme git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

78voto

JPLemme Points 1312

Une fois que vous avez retiré le dépôt, vous devriez pouvoir y aller :

git checkout 3ef0d...

13voto

Rafe Points 4602

uploadpack.allowReachableSHA1InWant

Desde Git 2.5.0 cette variable de configuration peut être activée sur le serveur, ici l'option Demande de fonctionnalité GitHub et le GitHub commit activant cette fonctionnalité .

Bitbucket Server l'a activé depuis la version 5.5+. .

Utilisation :

# 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"

2voto

eliben Points 490

Si un processus sur votre serveur en direct accède immédiatement au contenu qui vient d'être extrait (c'est-à-dire que vous ne pouvez pas travailler avec les éléments suivants git checkout 3ef0d après le pull), vous devriez envisager de baliser la version que vous voulez déployer en production et de vérifier spécifiquement cette balise en production, afin que le pull ne change pas immédiatement votre répertoire de travail. Sinon, vous risquez que quelqu'un pousse juste avant votre pull.

1voto

simon coleman Points 111

Notez qu'un git pull git checkout my-old-commit vous laisse maintenant dans un état DETACHED HEAD - effectivement vous envoyez les futurs commits dans ce dépôt sur un nouveau chemin commits. Pour un repo de déploiement, ce n'est pas un problème majeur, puisque les seuls commits devraient être ceux déjà commis correctement avant d'être tirés.

Cependant, il est parfois utile de vérifier que les marqueurs commit (head,tags,remotes) sont identiques à ceux du master repo. Pour corriger cela après votre checkout : git reset - rattache la tête git fetch - synchronise les marqueurs pour les remotes [cela peut dépendre de la version de git - il est vrai que notre environnement est toujours en 1.7... donc ce n'est peut-être plus nécessaire - YMMV].

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X