Git extrait une révision spécifique du dépôt distant

57

Nous avons un référentiel git distant que nous déployons normalement lorsque vous l'utilisez git pushsur notre serveur de développement, puis git pullsur nos serveurs en direct, pour obtenir la dernière version du référentiel transférée.

Mais si nous avons validé et poussé quelques révisions (sans git pullserveur actif), comment pouvons-nous faire une git pullréférence à l’ancien commit que nous voulons?

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

dlrust
la source

Réponses:

65

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

git checkout 3ef0d...
Scott Muc
la source
1
Nice, cela a fonctionné parfaitement. J'ai également remarqué que si je veux être synchronisé pour les futures sorties, je dois spécifier le serveur distant lors de la prochaine extraction (c'est-à-dire par git pull server:reporapport à la normale git pull)
dlrust
1
Peut-être qu'OP a posé la mauvaise question, mais pour moi c'est la bonne question et ce n'est pas une réponse. Il existe un commit spécifique sur le serveur qui manque localement. Le commit ne fait pas partie d'une branche ni d'un tag et il n'est pas transféré avec un pull / fetch. Comment récupérer un commit spécifique?
BlackEye
8

uploadpack.allowReachableSHA1InWant

Depuis Git 2.5.0, cette variable de configuration peut être activée sur le serveur, voici la demande de fonctionnalité GitHub et la validation par GitHub qui active cette fonctionnalité .

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"
Ciro Santilli 改造 中心 六四 事件
la source
2

Si un processus de votre serveur live accède immédiatement au contenu que vous venez de git checkout 3ef0dextraire (c’est-à-dire que vous ne pouvez pas travailler après l'extraction), vous devez envisager de baliser la version que vous souhaitez déployer en production et plus particulièrement d'extraire cette étiquette en production, de sorte que l'extraction ne soit pas immédiate. changez votre répertoire de travail. Sinon, vous risqueriez de pousser quelqu'un juste avant votre tirage.

Olaf
la source
1

Notez que git pull git checkout my-old-commit maintenant vous laisse dans un état DETACHED HEAD - vous envoyez effectivement des commits futurs dans ce référentiel par un nouveau chemin de validation. Pour un référentiel de déploiement, ce n'est pas un problème majeur, car les seuls validations doivent être celles déjà validées correctement avant d'être extraites.

Cependant, il est parfois utile de vérifier que les marqueurs de validation (tête, balises, télécommandes) sont identiques à ceux du référentiel principal. Pour résoudre ce problème après votre commande: 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 - notre environnement est toujours sur 1.7 ... donc peut-être plus nécessaire YMMV]

Simon Coleman
la source