git diff
est une commande en porcelaine (facile à utiliser). Pour les scripts, vous voudrez probablement utiliser la commande de plomberie correspondante git diff-tree
.
Vous pouvez obtenir git diff-tree
pour afficher les chemins complets, relatifs au dépôt git, en utilisant une combinaison de la commande --name-only
, -r
et --no-commit-id
options.
Exemples
Chemins des fichiers modifiés dans le "dernier" (le HEAD
) de la branche courante.
git diff-tree --name-only -r --no-commit-id HEAD
Chemins des fichiers dans la dernière livraison sur le serveur main
branche
git diff-tree --name-only -r --no-commit-id main
Chemins d'accès aux fichiers des trois derniers commits sur le fichier main
branche
git diff-tree --name-only -r main main~3
Chemins des fichiers du dernier commit sous le chemin src/
git diff-tree --name-only -r --no-commit-id main src/
Chemins absolus des fichiers modifiés dans le dernier commit de la branche courante.
git diff-tree --name-only -r --no-commit-id --line-prefix=`git rev-parse --show-toplevel`/ HEAD
Explication
git diff-tree
compare les blobs de deux arborescent objets.
Un commit est un treeish
qui pointe vers les objets du référentiel Root. Les répertoires sont également treeish
alors que les fichiers sont blobs
.
Running git diff-tree HEAD
va comparer les gouttes de HEAD
et HEAD~1
et contiennent la différence en blobs du dépôt Root. Pour voir tous les fichiers modifiés qui ne sont pas dans le Root, nous devons descendre dans le répertoire treeish
objets. Pour ce faire, on utilise la fonction -r
(comme dans recurse).
Notez que cela permet de comparer deux répertoires arbitraires dans des commits arbitraires.
Par défaut, si un seul commettre est spécifié, il est comparé à son parent. Par exemple, si vous exécutez git diff-tree HEAD
est équivalent à git diff-tree HEAD HEAD~1
. Si vous n'avez spécifié qu'un seul commit comme arborescent l'identifiant du commit parent est affiché. Utilisation de --no-commit-id
permet de s'en débarrasser.
git-diff-tree
imprime beaucoup d'informations que nous ne voulons pas (identifiants, permissions, si c'est un ajout, une suppression, une modification). Nous voulons juste le nom, donc nous utilisons --name-only
.
Si nous voulons des chemins absolus, nous devons préfixer toutes les lignes en utilisant quelque chose comme git rev-parse --show-toplevel
. Cela permet d'obtenir le chemin absolu du référentiel, sans la terminaison /
. Nous l'ajoutons donc.
--line-prefix=`git rev-parse --show-toplevel`/