Comment étiqueter un seul dossier dans un dépôt git
Un dossier contenant des fichiers suivis dans un référentiel Git a sa propre révision, stockée sous forme d'arborescence. L'objet enregistre les noms de ses fichiers et sous-dossiers et leurs propres hachages d'objet. Mais l'objet ne stocke pas son propre chemin, qui est stocké dans l'objet arborescence de son dossier parent. S'il s'agit du dossier racine du référentiel, son chemin n'est pas stocké du tout. Parce qu'il peut s'agir de n'importe quel nom lorsqu'il est cloné ou initialisé.
Si on suppose que le chemin du dossier dans le référentiel est ./foo
. On peut exécuter git ls-tree <commit> -- foo
ou git rev-parse <commit>:foo
pour voir le hachage de l'arbre de foo
. On peut donc le marquer par git tag <tagname> <tree_hash>
, ou sans connaître le hachage par git tag <tagname> <commit>:foo
.
Avec cette balise, on peut pousser ou récupérer les objets impliqués, ou extraire les fichiers et sous-dossiers réels, ou les manipuler.
Mais lorsqu'on clique dans GitHub sur la balise, elle affiche une page d'erreur (500 dans GOGS) car on s'attend à afficher la page de contenu de ce dossier (Github ne prend pas en charge l'affichage d'un objet arborescent).
Pour contourner cette restriction il faut :
- créer une nouvelle branche locale
git checkout <branch name> <branche vide>
- ajouter un dossier en utilisant
git --force add
- faire un commit
- marquer le commit
- faire un push de la branche
- faire un push des tags
git checkout -b foo empty git add . git commit -m 'commit de foo' git tag -a 'v1.0.0' -m 'ceci est la version 1.0.0' git push origin foo git push origin 'v1.0.0'
Il est possible de grouper les push en utilisant push --tags
. On peut ensuite supprimer la branche locale.
La branche locale doit être créée à partir d'une branche vide au risque d'embarquer l'arborescence de la branche master.
Pour créer une branche vide, avant de commencer à travailler dans le dépôt, faire:
git checkout -b empty touch '' README.md git add README.md git commit -m 'branche vide'