Je veux trouver le dernier commit qui a modifié un fichier source.
Je peux utiliser git blame
pour voir toutes les dates des commits pour chaque ligne, mais il est difficile de savoir exactement quel commit a été le dernier à toucher le fichier.
Comment trouver le dernier commit ayant touché un fichier donné dans mon référentiel git?
git log
permet de consulter l'historique de fichiers (et de répertoires) spécifiques. Vous pouvez donc l'appeler ainsi:
git log my/file.c
Si vous souhaitez uniquement répertorier la validation la plus récente , par exemple pour l'utiliser dans un script, utilisez la commande -n 1
option:
git log -n 1 --pretty=format:%H -- my/file.c
--pretty=format:%h
dit à git log
pour afficher uniquement le hachage de commit. Le --
separater empêche le nom de fichier d'être interprété comme un nom de validation, juste au cas où il serait ambigu.
Si vous voulez juste trouver le dernier commit, alors vous ne voulez pas git-log
, tu veux git-rev-list
, qui répertorie les objets de validation modifiant ce fichier dans le chemin de validation, en commençant par le plus récent (chronologiquement). Tout simplement:
git rev-list -1 <commit> <filename>
Pour git-rev-list
_ dans votre cas, vous venez de fournir:
Cela renvoie simplement l'ID de validation le plus récent de la branche en cours pour modifier ce fichier, ex: 215095e2e338525be0baeeebdf66bfbb304e7270
Pour un exemple plus complexe, vous pouvez utiliser des noms de balises, voire des références distantes, et inclure des noms de chemin relatifs avec des caractères génériques, par exemple:
git rev-list Origin/user/bob/testbranch -1 src/bfiles/*.txt
... Ce qui vous dirait quelle est la modification la plus récente apportée à la correspondance générique dans l'historique de cette branche. Les options pour rev-list sont extrêmes. Il s’agit de l’une des commandes de plomberie les plus importantes. Vous pouvez donc inclure ou exclure tout critère de votre choix.
Bien sûr, référez-vous à la page Page de manuel de git-rev-list (1) .
Si vous voulez juste obtenir le hash du dernier commit pour modifier un ensemble spécifique de fichiers (et voulez éviter awk
), vous pouvez utiliser:
git log -n 1 --pretty=format:%h -- <path>
Cela peut être utile pour obtenir le hash de commit pour une utilisation ultérieure avec git describe
.
Par exemple (au cas où cela serait utile pour quelqu'un)…
Je crée un identifiant de version actuelle en prenant en compte le dernier commit pour modifier n’importe quel fichier source (en supposant que vous marquiez les versions avec des balises telles que mycode-1.2.1
):
COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
continue
else
VN="mycode-unknown"
fi
Cela produit des identifiants comme:
mycode-1.2.1
- lorsque l’état actuel des fichiers source correspond à une version marquéemycode-1.2.1-g3k7s2
- lorsque l’état actuel des fichiers source correspond à une validation après une version marquéemycode-1.2.1-g3k7s2-mod
- lorsque l'état actuel des fichiers source a été modifié depuis le dernier commit suivant une version étiquetéemycode-unknown
- quand aucune balise de version n'a encore été crééeJe ne sais pas si c'est ce que vous voulez, mais si vous faites un git log <thefile>
pour obtenir les commits qui ont modifié ce fichier. Vous pouvez choisir le plus haut. Ce devrait être celui que vous recherchez.
Une fois que vous avez l'ID SHA du commit que vous souhaitez utiliser, utilisez git log FILENAME
, vous devriez pouvoir faire git show SHA_ID_HERE
pour voir ce que vous avez fait pour ce commit particulier. Vous n'avez même pas besoin d'entrer l'ID complet; les 6 premiers caractères devraient suffire.
pour obtenir le ref sur une seule ligne, essayez:
git log -n1 --oneline <path> | awk '{print $1;}'