0
votes

Comment puis-je savoir si je suis à l'intérieur d'une sous-coode git?

vldr; Comment puis-je savoir que mon répertoire de travail actuel est à l'intérieur d'un répertoire sous-module?

Les processus de travail diffèrent si vous travaillez à l'intérieur ou à l'extérieur sous-modulations. Et heure et encore je suis confus parce que je ne suis pas conscient que je suis à l'intérieur d'une sous-coode.

de manière optimale __ git_ps1 me montrerait que je suis à l'intérieur d'une sous-module, mais apparemment n'a aucune disposition à le faire.

J'aimerais corriger __ git_ps1 pour me montrer le fait que je suis à l'intérieur d'une sous-module, mais je ne trouve pas de manière élégante Pour interroger Git pour ce fait.

Idéalement, je voudrais avoir une fonction shell comme ceci: xxx

Qu'est-ce que Quelqu'un_magic ?


0 commentaires

3 Réponses :


2
votes

Potentiellement, vous pouvez regarder le répertoire .git . Si c'est pas réellement un répertoire, vous pouvez être sûr que vous êtes dans une sous-module. Au moins avec des versions récentes de git, l'entrée .git est en fait un fichier qui ressemble à quelque chose comme: xxx

en fonction de la manière dont la sous-module a été ajoutée, il peut encore avoir un répertoire .git . Il y a une commande Summodule GIT AbsorbgitDirs pouvant être exécutée dans le référentiel parent qui résoudra ceci; à partir du Summodule git Homme:

Si un répertoire git d'une sous-module est à l'intérieur du sous-module, déplacez le répertoire git de la sous-module dans son chemin SuperProjects $ git_dir / modules, puis connectez le répertoire GIT et son répertoire de travail en définissant le Core.worktree et l'ajout. Fichier GIT pointant vers le répertoire GIT incorporé dans le répertoire Git SuperProjects.

Un référentiel cloné de manière indépendante et ajoutée ultérieurement en tant que sous-module ou d'anciennes configurations dispose du répertoire git sous-modules à l'intérieur du sous-module au lieu d'incorporer dans le répertoire Git SuperProjects.

Cette commande est récursive par défaut.

... Mais cela reste problématique car pendant que le test est facile lorsque vous êtes à la racine du sous-module, il est plus difficile lorsque vous êtes dans un répertoire profondément imbriqué (car vous auriez alors Pour rechercher itérativement les répertoires parent jusqu'à la recherche d'un .git ou vous atteignez / ). <


L'entrée de la page de manuel J'ai cité ci-dessus points États-Unis à une seconde, meilleure option:

dans une sous-module, la valeur CORE.WORKTREE est définie (sur un chemin relatif de la racine du sous-module de retour). Cela signifie que vous pouvez (a) vérifier si le paramètre CORE.WORKTREE a une valeur pour déterminer si vous êtes dans une sous-module, et (B), vous pouvez utiliser la valeur de .worktree pour déterminer le nom de la sous-module. Qui nous fait quelque chose comme: xxx

Je ne sais pas s'il y a d'autres situations dans lesquelles corporel.worktree sera défini automatiquement, mais ceci semble travailler dans mes tests limités.


0 commentaires

3
votes

Git Rev-Payse --Show-SuperProject-Tree-Tree-Tree-Traduct -

sortira rien si le référentiel actuel n'est pas utilisé comme sous-module par aucun projet.


1 commentaires

Remarque: ceci était nouveau dans Git 2.13, et il y avait une solution de bogue mineur en 2.19.2 (il s'agissait de si le superproject avait une soumission de conflit de sous-module). Informations trouvées en exécutant Git journal -s show-Superproject-work-arborescence dans le référentiel git pour git, puis vérifiant contenant des balises pour les révisions énumérées.



2
votes

Sumouule-ness est juste une question de savoir comment un repo utilisé est utilisé, que la commande actuelle soit ce que quelque chose à la commande devraient être là.

Vous pouvez voir si l'arbre de travail est à l'intérieur d'un autre arbre de travail qui pense qu'il devrait exister Soyez une commande ici: P>

top=`git rev-parse --show-toplevel 2>&-` || exit
if up=`git -C "$top/.." rev-parse --show-toplevel 2>&-` 
then    echo work tree is at ${top#$up/} in another work tree
        at=`git -C "$up" rev-parse :${top#$up/}` && echo ... which thinks $(git cat-file -t $at) $at should be checked out there
fi


0 commentaires