Comment extraire un seul fichier d'un repo git ?
Pouvez-vous valider les changements dans le checkout sparse ?
Comment extraire un seul fichier d'un repo git ?
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.
git config core.sparsecheckout true
).git/info/sparse-checkout
fichierPour 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.
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 ?
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
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).
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.
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.
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
Vous pouvez également utiliser une balise ou un nom de branche, et pas seulement le hachage. C'est souvent plus facile.
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 ?
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).
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.
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
Duplicata possible de Comment revenir au dernier commit d'un fichier dans git ?
0 votes
Vous pouvez utiliser l'extension chrome GitHub Mate vous permet de cliquer sur l'icône du fichier pour le télécharger.
0 votes
Duplicata possible de Récupérer un seul fichier dans un référentiel
0 votes
Voir plutôt : stackoverflow.com/a/600189/42223
0 votes
J'ai créé un
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. Voir ici : stackoverflow.com/questions/60190759/0 votes
En outre, les personnes qui atterrissent ici à partir d'une recherche Google recherchent peut-être ceci, même s'il s'agit d'une question totalement différente : Comment obtenir un seul fichier d'une autre branche .