Obtenir une seule révision de Git

14

Le fait d'avoir l'historique de révision complet de Git présente de nombreux avantages dans le cadre du processus de développement.

Mais notre produit est le code source, nous utilisons des langages de script qui n'ont pas besoin de compilation ou de traitement, puis l'historique Git devient une charge pour le déploiement - dans notre exemple, nous déployons un environnement virtuel propre après chaque changement, ayant plusieurs déploiements sur une seule machine.

Il existe des moyens de réduire la quantité d'historique, par exemple des clones peu profonds dont l'efficacité dépend de la profondeur de la révision dans la branche, en effectuant une extraction au lieu de cloner, mais vous obtenez toujours l'historique de la révision et inversement, ou en obtenant l'intégralité repo une fois puis tirez quand vous en avez besoin, mais cela est un gaspillage en termes d'espace disque et a tendance à être moins fiable.

Existe-t-il un moyen d'obtenir une seule révision de Git sans son historique?

Rsf
la source
1
Questions et réponses connexes sur SO stackoverflow.com/questions/26135216/…
Evgeny

Réponses:

16

Clone peu profond

Vous pouvez en effet obtenir un clone peu profond de Git en utilisant:

git clone --depth=1 <url>

Cela clonera toujours le dépôt et créera un .gitdossier avec les objets, mais de taille plus petite (différence en fonction de la taille totale de votre fichier par rapport à la taille de l'historique).

Archives Git

Vous pouvez également utiliser git-archive pour extraire une archive du dépôt:

Crée une archive du format spécifié contenant la structure arborescente de l'arborescence nommée et l'écrit dans la sortie standard. Si est spécifié, il est ajouté aux noms de fichiers dans l'archive.

Dans les exemples, il montre par exemple:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

Créez une archive tar compressée pour la version .

Git hébergé, API d'archivage

Si vous hébergez votre dépôt sur GitHub, vous pouvez utiliser leur API d'archivage :

https://api.github.com/repos/<username>/<repository>/zipball/<commit_hash>

Bitbucket.org a la même fonctionnalité pour cela:

https://bitbucket.org/<username>/<repository>/get/<branch_name|commit_hash|tag>.zip

7ochem
la source
7ochem, peut-être que la commande gzip doit être gzip -c ....
Romeo Ninov
11

Ne déployez pas votre dépôt git. Développer une véritable méthodologie de déploiement. Même si c'est aussi simple que de tarauder une archive (= construire un artefact avec juste les fichiers nécessaires à déployer) de scripts déployés.

Même si vous clonez peu profondément la pointe de votre référentiel source, vous n'avez probablement pas besoin de tests unitaires, de documentation, de profils de peluches et d'autres éphémères de support dans votre environnement déployé.

Remarque : pour les référentiels de langages scriptés qui n'ont pas vraiment d'étape de «construction», une manière triviale de libérer un artefact serait de les empaqueter dans une archive, comme tar ou rpm. Ensuite, pour "déployer", vous décompressez l'archive ou installez le rpm. cela supprime le besoin d'outils git dans votre chaîne de déploiement (tous les serveurs de prod n'auront pas ces outils de développement).

RubyTuesdayDONO
la source
il est normal de remettre en question (ou même de contester!) une réponse - c'est ce qui rend Stack Exchange génial :) pour les référentiels de langages de script qui n'ont pas vraiment d'étape de "construction", une manière triviale de publier un artefact serait de conditionner les dans une archive, comme tar ou rpm. puis, pour "déployer", vous décompressez l'archive ou installez le rpm. cela supprime le besoin d'outils git dans votre chaîne de déploiement (tous les serveurs de prod n'auront pas ces outils de développement)
RubyTuesdayDONO
1
@ Pierre.Vriens oui, il vous manque ce qui est suggéré comme goudronner une archive, c'est-à-dire construire un artefact avec juste les fichiers nécessaires à déployer. Cela dit, je suis d'accord que ce n'est pas une réponse de qualité et ce point devrait être étendu. Nous sommes en version bêta privée et les réponses doivent
naître
Alors je ne vois pas ce que cela apporte de plus que la réponse acceptée, si c'est pour pointer vers l'archive en forme ... c'est juste redondant, vous devriez éditer pour étendre de cette façon iMHo
Tensibai
1
Veuillez vérifier ma modification de votre réponse (venez d'intégrer votre commentaire intéressant). N'hésitez pas à améliorer / retravailler bien sûr, ou tout simplement à revenir en arrière si vous n'aimez pas du tout mon montage. BTW: votre commentaire (= note que j'ai ajoutée) m'a fait penser "vraiment, aussi simple? Encore une fois un échantillon de la façon dont nous faisons avancer les choses dans zOS ... avec z pour zéro temps d'arrêt ...". Je pense qu'il est temps de commencer à remettre en question bien plus de questions / réponses via des commentaires similaires ... Ne me
mets
Je ne prétends pas que ce soit une réponse complète ou modèle, mais je n'ai vu personne d'autre s'adresser à l'éléphant dans la pièce: si vous utilisez git pour "déployer" votre projet, vous "allez vous amuser" ;)
RubyTuesdayDONO
6

Question existe-t-il un moyen d'obtenir une seule révision de Git sans son historique?

Pour obtenir un référentiel, non, il n'y a aucun moyen, principalement parce qu'il n'y a pas de «révision». Les validations de Git Store, qui sont des modifications par rapport à l'état précédent.
Si vous voulez que votre référentiel à un moment précis, vous devez retirer le commit à ce moment et tous ses ancêtres ou vous n'obtiendrez que les modifications apportées dans le commit.

Pour éviter toute confusion: le clonage superficiel obtient l'historique nécessaire puis le tronque en espace libre, l'arbre est toujours fabriqué à partir de l'histoire.

Pour les solutions, @ 7ochem answer les couvre.

Tensibai
la source