web-dev-qa-db-fra.com

Comment lister les sous-arbres git à la racine?

Par exemple, vous pouvez faire un git remote --verbose et git affichera toutes les télécommandes que vous avez sur votre projet, git branch affichera toutes les branches et signalera la branche actuelle, mais comment lister toutes les sous-arborescences, sans aucune commande destructrice? git subtree donnera les exemples d'utilisation, mais ne listera rien. la sous-arborescence n'a que add, pull, Push, split, merge.

38
pocesar

Il n'y a aucun moyen explicite de le faire (au moins, pour l'instant), les seules commandes disponibles sont répertoriées ici (comme vous l'avez noté vous-même, mais voici une référence pour les futurs chercheurs): https: // github. com/git/git/blob/master/contrib/subtree/git-subtree.txt

J'ai parcouru le code (fondamentalement tout ce mécanisme est un gros fichier de script Shell), tout le suivi est effectué via des messages de validation, donc toutes les fonctions utilisent git log mécanisme avec beaucoup de grep- pour localiser ses propres données.

Étant donné que la sous-arborescence doit avoir un dossier du même nom dans le dossier racine du référentiel, vous pouvez l'exécuter pour obtenir les informations souhaitées (dans Bash Shell):

git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq

Maintenant, cela ne vérifie pas si le dossier existe ou non (vous pouvez le supprimer et le mécanisme de sous-arbre ne le saura pas), alors voici comment vous pouvez répertorier uniquement les sous-arbres existants, cela fonctionnera dans n'importe quel dossier du référentiel:

 git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then echo {}; fi'

Si vous êtes vraiment à la hauteur, proposez-le aux gars de Git pour l'inclure dans les prochaines versions :)

49
Sagi Iltus

Suite à réponse de Sagi Illtus , ajoutez l'alias suivant à votre ~/.gitconfig

[alias]
    ls-subtrees = !"git log | grep git-subtree-dir | awk '{ print $2 }'"

Ensuite vous pouvez git ls-subtrees à partir de la racine de votre référentiel pour afficher tous les chemins de sous-arborescence:

$> cd /path/to/repository
$> git ls-subtrees
some/subtree/dir
27
miraculixx

Le problème avec l'accueil du journal est que cela ne vous dit pas si le sous-arbre existe toujours ou non. J'ai travaillé autour de cela en testant simplement l'existence du répertoire:

[alias]
        ls-subtrees = !"for i in $(git log | grep git-subtree-dir | sed -e 's/^.*: //g' | uniq); do test -d $i && echo $i; done"
0
Paul Mundt