Comment vérifier si un fichier existe dans un dépôt Git

GitGitBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), vous apprendrez à vérifier si un fichier existe dans l'historique d'un dépôt Git. Nous allons explorer deux méthodes principales : utiliser la commande git ls-tree pour inspecter le contenu d'un commit spécifique et utiliser git log avec un chemin de fichier pour afficher l'historique d'un fichier particulier.

Grâce à des exercices pratiques, vous allez pratiquer l'utilisation de git ls-tree pour examiner les fichiers présents dans un instantané (snapshot) d'un commit et utiliser git log -- <file> pour vérifier l'existence et l'historique d'un fichier. Nous allons également tester ces méthodes avec des fichiers inexistants pour comprendre leur comportement.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/status("Check Status") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/status -.-> lab-560021{{"Comment vérifier si un fichier existe dans un dépôt Git"}} git/log -.-> lab-560021{{"Comment vérifier si un fichier existe dans un dépôt Git"}} end

Exécuter git ls-tree pour vérifier un fichier

Dans cette étape, nous allons explorer comment regarder à l'intérieur de notre machine à remonter le temps Git en utilisant la commande git ls-tree. Cette commande nous permet de voir le contenu d'un commit spécifique, comme si nous regardions à l'intérieur d'une capsule temporelle scellée sans l'ouvrir complètement.

Tout d'abord, assurons-nous que nous sommes dans le répertoire de notre projet :

cd ~/project/my-time-machine

Maintenant, utilisons git ls-tree pour voir le contenu de notre dernier commit. Nous avons besoin de l'identifiant du commit, que vous pouvez obtenir à partir de la sortie de git log. Alternativement, vous pouvez utiliser HEAD qui fait référence au dernier commit.

git ls-tree HEAD

Vous devriez voir une sortie similaire à celle-ci :

100644 blob a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9	message.txt

Décortiquons cette sortie :

  • 100644 : Il s'agit du mode de fichier, indiquant qu'il s'agit d'un fichier ordinaire.
  • blob : Cela nous indique qu'il s'agit d'un objet "blob" dans Git, qui est la manière dont Git stocke le contenu des fichiers.
  • a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 : Il s'agit de l'identifiant unique (hash) de l'objet blob, représentant le contenu exact du fichier message.txt au moment du commit.
  • message.txt : Il s'agit du nom du fichier.

La commande git ls-tree est utile pour inspecter le contenu d'un commit sans le checker out. Elle vous montre les fichiers et les répertoires qui faisaient partie de ce instantané (snapshot) spécifique dans le temps. Cela diffère de git status, qui vous montre l'état actuel de votre répertoire de travail par rapport au dernier commit.

Comprendre git ls-tree vous aide à voir comment Git stocke l'historique de votre projet sous forme de série d'instantanés, chacun avec son propre ensemble de fichiers et de répertoires.

Utiliser git log -- File pour vérifier

Dans l'étape précédente, nous avons utilisé git ls-tree pour voir le contenu d'un commit. Maintenant, explorons une autre façon d'afficher l'historique lié à un fichier spécifique en utilisant git log avec un chemin de fichier.

Assurez-vous que vous êtes toujours dans le répertoire de votre projet :

cd ~/project/my-time-machine

Maintenant, utilisons git log pour voir l'historique de notre fichier message.txt :

git log -- message.txt

Vous devriez voir l'entrée du journal (log) pour le commit où nous avons créé message.txt :

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Your Name <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

La partie -- message.txt de la commande indique à git log de n'afficher que les commits qui ont affecté le fichier message.txt. Cela est incroyablement utile lorsque vous avez un grand projet avec de nombreux fichiers et que vous ne voulez voir que l'historique d'un fichier spécifique.

Cette commande vous aide à répondre à des questions telles que :

  • Quand ce fichier a-t-il été créé ?
  • Qui a effectué la dernière modification sur ce fichier ?
  • Quelles étaient les modifications apportées à ce fichier dans un commit spécifique ?

Au fur et à mesure que votre projet grandit et que vous effectuez plus de commits, l'utilisation de git log -- <file> deviendra essentielle pour comprendre l'historique et l'évolution des fichiers individuels au sein de votre projet.

Appuyez sur q pour quitter la vue du journal.

Tester des fichiers non existants

Dans les étapes précédentes, nous avons utilisé avec succès git ls-tree et git log -- <file> pour inspecter un fichier qui existe dans notre dépôt Git. Maintenant, voyons ce qui se passe lorsque nous essayons d'utiliser ces commandes sur un fichier qui n'existe pas dans l'historique du dépôt.

Assurez-vous que vous êtes dans le répertoire de votre projet :

cd ~/project/my-time-machine

Tout d'abord, essayons d'utiliser git ls-tree sur un fichier non existant, par exemple, nonexistent.txt :

git ls-tree HEAD nonexistent.txt

Vous ne devriez voir aucune sortie. C'est parce que git ls-tree ne liste que les entrées présentes dans l'arbre spécifié (dans ce cas, l'arbre à HEAD). Étant donné que nonexistent.txt n'est pas dans l'arbre du dernier commit, il n'affiche rien.

Maintenant, essayons d'utiliser git log sur le même fichier non existant :

git log -- nonexistent.txt

Vous devriez voir une sortie similaire à celle-ci :

fatal: no such path 'nonexistent.txt' in HEAD

C'est un comportement différent ! git log -- <file> recherche spécifiquement les commits qui ont affecté le chemin de fichier donné tout au long de l'historique. Si le chemin de fichier n'a jamais existé dans aucun commit, Git vous indique qu'il n'y a "pas de tel chemin".

Cette différence de comportement met en évidence le fonctionnement de ces commandes :

  • git ls-tree inspecte un instantané spécifique (commit) et liste son contenu.
  • git log -- <file> recherche dans tout l'historique les modifications liées à un chemin de fichier spécifique.

Comprendre ces différences vous aide à choisir la bonne commande pour la tâche. Si vous voulez voir quels fichiers étaient dans un commit, utilisez git ls-tree. Si vous voulez voir l'historique d'un fichier, utilisez git log -- <file>.

Résumé

Dans ce laboratoire (lab), nous avons appris à vérifier si un fichier existe dans l'historique d'un dépôt Git sans extraire (check out) des commits spécifiques. Nous avons d'abord exploré la commande git ls-tree, qui nous permet d'inspecter le contenu d'un commit particulier (comme HEAD) et de voir les fichiers et leurs hachages de blocs (blob hashes) correspondants. Cette commande fournit un instantané du dépôt à un moment précis, affichant les modes de fichier, les types d'objets, les identifiants d'objets et les noms de fichiers.

Nous avons ensuite commencé à explorer l'utilisation de git log avec un chemin de fichier pour afficher l'historique des commits spécifiquement lié à ce fichier. Cette méthode nous permet de voir quand un fichier a été ajouté, modifié ou supprimé, offrant une perspective différente sur son existence dans la chronologie du dépôt.