web-dev-qa-db-fra.com

Comment puis-je obtenir l'ID de validation associé à un sous-module git à partir d'une précédente validation dans le clone parent?

Existe-t-il un moyen, à l'exception de l'extraction de la validation parent, de déterminer l'ID de validation SHA-1 d'un sous-module en fonction d'un ID de validation dans le clone parent? Je sais que je peux trouver le SHA-1 actuellement associé à 'git submodule'.

Voici un exemple: J'ai un clone avec un seul sous-module 'foo' qui a changé plusieurs fois au cours du dernier mois. J'ai un tag dans le clone parent qui date de quelques semaines et qui s'appelle 'release-1.2.3'. Je veux savoir ce que le SHA-1 associé de 'foo' était pour ce commit étiqueté. Je pourrais simplement vérifier 'release-1.2.3' et utiliser git-submodule pour voir, mais je me demande s'il existe un moyen de faire cela sans affecter l'arbre de travail, comme je veux le scripter.

Je veux le faire parce que je veux construire un script pour effectuer un "diff" sur toutes les modifications d'un sous-module entre deux commits dans le référentiel parent - c'est-à-dire "dites-moi quels fichiers ont changé dans le sous-module" foo "entre ces deux commits dans le parent."

38
davidA

Vous pouvez utiliser git-ls-tree pour voir quel était l'identifiant SHA-1 d'un chemin donné lors d'une validation donnée:

$ git ls-tree released-1.2.3 foo
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  foo

(Ma première pensée était git show released-1.2.3 foo, mais cela échoue avec "fatal: bad object".)

Comme vous écrivez la sortie, vous voudrez probablement obtenir l’ID SHA-1 seul, par exemple:

$ git ls-tree released-1.2.3 foo | awk '{print $3}'
c0f065504bb0e8cfa2b107e975bb9dc5a34b0398

Aussi: lorsque vous écrivez des scripts autour de git, essayez de vous en tenir aux commandes plumbing , comme décrit dans le manuel. Ils ont une interface plus stable, alors que les commandes plus familières de «porcelaine» changeront probablement de manière incompatible.

49
Josh Lee

Celui-ci a fonctionné pour moi:

$ git rev-parse released-1.2.3^{commit}:foo
<SHA1>

Peut-être aussi assez facile à utiliser dans le script.

6
mash5

J'ai trouvé une avenue prometteuse:

$ git log --raw <since>..<until> --submodule -- <path/to/submodule>

Avec l'option --raw, cela affiche les ID SHA-1 (abrégés) correspondant aux validations associées du sous-module. Malheureusement, la sortie est très prolixe et il faudra un peu de travail pour la traiter dans un script.

Ce dont j'ai vraiment besoin, c'est d'une installation git qui, avec un ID de commit parent, me donne la dernière modification apportée à un sous-module avant ce commit. C'est à dire. quel sous-module SHA-1 'mise à jour de sous-module git' vérifierait si je vérifiais réellement ce commit parent.

2
davidA

git slave (gits) pourrait être votre réponse. 

http://gitslave.sourceforge.net/

Mais vous pouvez aussi le faire avec des gitans ordinaires… Ce n'est pas aussi facile.

0
Adam Dymitruk