606 votes

Comment extraire de manière éparse un seul fichier d'un dépôt git ?

Comment extraire un seul fichier d'un repo git ?

11 votes

Qu'entendez-vous par "check out" ? Obtenir une copie d'un seul fichier à partir d'un référentiel distant ?

2 votes

Si le repo en question utilise gitweb, vous pouvez simplement télécharger le fichier directement à partir de là. Comme j'essaie de l'expliquer ci-dessous, ce que vous demandez n'est pas vraiment une opération standard de git.

2 votes

276voto

VonC Points 414372

A l'origine, j'ai mentionné en 2012 git archive (voir Jared Forsyth 's réponse y Robert Knight 's réponse ), puisque git1.7.9.5 (mars 2012) , Paul Brannan 's réponse :

git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -

Mais : en 2013, ce n'était plus possible. pour les URLs distants de https://github.com .
Voir l'ancienne page " Puis-je archiver un référentiel ? "

La page actuelle (2018) " À propos de l'archivage du contenu et des données sur GitHub "recommande d'utiliser des services tiers comme GHTorrent o Archives GH .


Vous pouvez donc également traiter les copies/clones locaux :

Vous pouvez aussi faire ce qui suit si vous avez une copie locale du dépôt nu comme mentionné dans cette réponse ,

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file

Ou vous devez cloner d'abord le repo, ce qui signifie que vous obtenez l'historique complet : - dans le repo .git - dans l'arbre de travail.

  • Mais alors vous pouvez faire un vérification éparse (si vous utilisez Git1.7+), :
    • activez l'option de vérification clairsemée ( git config core.sparsecheckout true )
    • en ajoutant ce que vous voulez voir dans le .git/info/sparse-checkout fichier
    • relecture de l'arbre de travail pour n'afficher que ce dont vous avez besoin

Pour relire l'arbre de travail :

$ git read-tree -m -u HEAD

De cette façon, vous vous retrouvez avec un arbre de travail comprenant précisément ce que vous voulez (même s'il ne s'agit que d'un seul fichier).


Richard Gomes points ( dans les commentaires ) à " Comment cloner, récupérer ou extraire un répertoire unique ou une liste de répertoires du dépôt git ? "

Une fonction bash qui évite de télécharger l'historique, qui récupère une seule branche et qui récupère une liste de fichiers ou de répertoires dont vous avez besoin.

0 votes

Pouvez-vous valider les changements dans le checkout sparse ?

2 votes

@Tilo : pas sûr, mais ça devrait être possible, vu que le clone a été un clone complet.

3 votes

En quoi est-ce mieux que "git checkout HASH path-to-file" comme indiqué dans d'autres réponses ? Est-ce que ce n'était tout simplement pas disponible à l'époque ?

264voto

Nick Moore Points 7897

Clonez d'abord le dépôt avec l'option -n, qui supprime l'extraction par défaut de tous les fichiers, et l'option --depth 1, qui signifie qu'il ne récupère que la révision la plus récente de chaque fichier.

git clone -n git://path/to/the_repo.git --depth 1

Ensuite, vérifiez juste le fichier que vous voulez comme ceci :

cd the_repo
git checkout HEAD name_of_file

12 votes

Bien qu'il s'agisse littéralement d'extraire un seul fichier, ce n'est certainement pas ce que le PO veut faire, puisqu'il aura tous les fichiers (et l'extraction est de toute façon inutile).

5 votes

Je ne pense pas que ça marche, avec -n l'arbre de travail et l'index finissent par être synchronisés. C'est-à-dire que tout le contenu apparaît comme supprimé. Vous devez soit git reset HEAD o git checkout HEAD file . Il est également très difficile de travailler avec le dépôt à ce stade, sauf si vous comprenez vraiment comment fonctionne git.

0 votes

Oui, vous avez tout à fait raison. J'ai donné la réponse avant de l'essayer moi-même. J'allais le supprimer, mais avec vos ajouts utiles, je vais le laisser maintenant.

120voto

techexpert Points 820

Si vous disposez déjà d'une copie du dépôt git, vous pouvez toujours extraire une version d'un fichier à l'aide d'une balise git log pour trouver le hash-id (par exemple 3cdc61015724f9965575ba954c8cd4232c8b42e4) et ensuite vous tapez simplement :

git checkout hash-id path-to-file

Voici un exemple concret :

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css

14 votes

Vous pouvez également utiliser une balise ou un nom de branche, et pas seulement le hachage. C'est souvent plus facile.

4 votes

Bonne solution. Mais si path-to-file est un répertoire, et current HEAD contient certains fichiers tandis que target ne le fait pas, (ou vice versa), cela ne mettra pas correctement à jour le fichier. Existe-t-il un moyen de gérer ?

2 votes

Plus simple et meilleur. Merci !

45voto

Git checkout branche_ou_version -- chemin/fichier

exemple : git checkout HEAD -- main.c

0 votes

J'ai vraiment été confus par les autres réponses. Ceci a fonctionné pour moi. Avant la mise à jour, j'ai supprimé le fichier à remplacer, puis j'ai fait ceci : git checkout HEAD abcd.cpp

24voto

anvk Points 296

Travailler avec GIT 1.7.2.2

Par exemple, vous avez un certains_distants avec des branches branche 1 , branche32

donc pour extraire un fichier spécifique, il faut appeler cette commande :

git checkout remote/branch path/to/file

à titre d'exemple, ce sera quelque chose comme ceci

git checkout some_remote/branch32 conf/en/myscript.conf
git checkout some_remote/branch1 conf/fr/load.wav

Cette commande checkout copiera toute la structure de fichiers conf/en et conf/fr dans le répertoire actuel où vous appelez ces commandes (bien sûr, je suppose que vous avez lancé git init à un moment donné auparavant).

6 votes

Mais vous devez exécuter git fetch some_remote avant, n'est-ce pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X