Comment extraire un seul fichier d'un dépôt git?
git
file
git-checkout
sparse-checkout
Arthur Ulfeldt
la source
la source
Réponses:
A l' origine, je l' ai mentionné en 2012
git archive
(voir Jared Forsyth est réponse et Robert Knight 's réponse ), depuis git1.7.9.5 (Mars 2012) , Paul Brannan de réponse :Mais: en 2013, cela n'était plus possible pour les URL https://github.com distantes .
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 tels que GHTorrent ou GH Archive .
Vous pouvez donc également gérer les copies / clones locaux:
Vous pouvez également effectuer les opérations suivantes si vous disposez d'une copie locale du référentiel nu, comme indiqué dans cette réponse ,
Ou vous devez d'abord cloner le dépôt, ce qui signifie que vous obtenez l'historique complet: - dans le dépôt .git - dans l'arborescence de travail.
git config core.sparsecheckout true
).git/info/sparse-checkout
fichierPour relire l'arborescence de travail:
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 pointe ( dans les commentaires ) sur " Comment puis-je cloner, récupérer ou extraire une extraction d'un répertoire unique ou d'une liste de répertoires à partir du référentiel git? "
la source
git archive
maintenant.Commencez par cloner le référentiel avec l'option -n, qui supprime l'extraction par défaut de tous les fichiers, et l'option --depth 1, ce qui signifie qu'il n'obtient que la révision la plus récente de chaque fichier.
Ensuite, vérifiez uniquement le fichier que vous souhaitez comme ceci:
la source
-n
l'arbre de travail et l'index finissant en synchronisation. Autrement dit, tout le contenu apparaît comme supprimé. Vous devez soitgit reset HEAD
ougit checkout HEAD file
. Il est également très difficile de travailler avec le référentiel à ce stade, sauf si vous comprenez vraiment comment git fonctionne.rm -rf .git
au script de NickMoore, nettoierait toutes les traces du repo cloné et apaiserait peut-être Jefromi quant à un repo difficile à utiliser. Cela me rend très utile pour plusieurs applications, comme mon défi aujourd'hui de construire un hook post-réception pour mettre à jour automatiquement la version d'un autre hook post-réception.git
pas la meilleure pour ce genre de travail). Cette réponse est également valable pour cette question , ou cette autre populaire , et bien d'autres: passezname_of_file
àname_of_folder
. De nos jours (2014s), Git propose des sous - modules aux propriétaires de référentiels et certains sont conviviaux pour les utilisateurs de référentiels.Si vous avez déjà une copie du dépôt git, vous pouvez toujours extraire une version d'un fichier à l'aide de a
git log
pour connaître le hash-id (par exemple 3cdc61015724f9965575ba954c8cd4232c8b42e4), puis vous tapez simplement:Voici un exemple réel:
la source
path-to-file
s'agit d'un répertoire et que currentHEAD
contient certains fichiers alors que cetarget
n'est pas le cas (ou vice versa), cela ne mettra pas correctement à jour le fichier. Existe-t-il un moyen de gérer?Normalement, il n'est pas possible de télécharger un seul fichier
git
sans télécharger l'intégralité du référentiel comme suggéré dans la première réponse. C'est parce que Git ne stocke pas les fichiers comme vous le pensez (comme le font CVS / SVN), mais il les génère en fonction de l'historique complet du projet.Mais il existe des solutions de contournement pour des cas spécifiques. Les exemples ci - dessous avec des espaces réservés pour
user
,project
,branch
,filename
.GitHub
GitLab
GitWeb
Si vous utilisez Git sur le serveur - GitWeb , alors vous pouvez essayer dans l'exemple (le changer dans le bon chemin):
GitWeb sur drupalcode.org
Exemple:
googlesource.com
Il existe une fonctionnalité non documentée qui vous permet de télécharger des versions encodées en base64 de fichiers bruts:
Dans d'autres cas, vérifiez si votre référentiel Git utilise des interfaces Web.
Si elle ne l' utilise une interface Web, vous pouvez envisager de pousser votre code à des services externes tels que GitHub , Bitbucket , etc . et l'utiliser comme miroir.
Si vous ne l'avez pas
wget
installé, essayezcurl -O (url)
alternativement.la source
wget
réponse brillante et les retours de simplicité, ainsi que le bonheur. Merci mec.git checkout branch_or_version - chemin / fichier
exemple:
git checkout HEAD -- main.c
la source
Guide minimal
git checkout -- <filename>
Réf: https://git-scm.com/docs/git-checkout
Dup: Annuler les modifications de copie de travail d'un fichier dans Git?
la source
git-checkout
.Maintenant nous pouvons! Comme il s'agit du premier résultat sur Google, j'ai pensé mettre à jour ce dernier. Avec l'avènement de git 1.7.9.5, nous avons la
git archive
commande qui vous permettra de récupérer un seul fichier depuis un hôte distant.Voir la réponse complète ici https://stackoverflow.com/a/5324532/290784
la source
github.com
HEAD
oumaster
nonHEAD:directory
.git archive [email protected]:user/repo branch:path/to file | tar -x
Travailler dans GIT 1.7.2.2
Par exemple, vous avez une télécommande some_remote avec des branches branch1 , branch32
donc pour extraire un fichier spécifique, vous appelez ces commandes:
à titre d'exemple, ce sera quelque chose comme ça
Cette commande d'extraction copiera la structure de fichier entière conf / en et conf / fr dans le répertoire courant où vous appelez ces commandes (bien sûr, je suppose que vous avez exécuté git init à un moment donné auparavant)
la source
git fetch some_remote
avant, non?Très simple:
Cela ne vérifie pas la
from-branch-name
succursale. Vous resterez sur la branche sur laquelle vous vous trouvez et seul ce fichier sera extrait de la branche spécifiée.Voici la partie pertinente de la page de manuel pour
git-checkout
Pointe du chapeau à Ariejan de Vroom qui m'a appris cela à partir de ce blog .
la source
git clone --filter
de Git 2.19Cette option sautera en fait la récupération de la plupart des objets inutiles du serveur:
Le serveur doit être configuré avec:
Il n'y a pas de support serveur à partir de la v2.19.0, mais il peut déjà être testé localement.
TODO:
--filter=blob:none
ignore tous les blobs, mais récupère toujours tous les objets d'arbre. Mais sur un dépôt normal, cela devrait être minuscule par rapport aux fichiers eux-mêmes, donc c'est déjà assez bon. Demandé à: https://www.spinics.net/lists/git/msg342006.html Devs a répondu qu'un--filter=tree:0
était en train de le faire.N'oubliez pas que cela
--depth 1
implique déjà--single-branch
, voir aussi: Comment cloner une seule branche dans Git?file://$(path)
est nécessaire pour surmontergit clone
les manigances du protocole: Comment cloner superficiellement un dépôt git local avec un chemin relatif?Le format de
--filter
est documenté surman git-rev-list
.Une extension a été apportée au protocole distant Git pour prendre en charge cette fonctionnalité.
Documents sur l'arbre Git:
Testez-le
GitHub en amont .
Sortie dans Git v2.19.0:
Conclusions: tous les blobs sauf
d1/a
sont manquants. Par exemplef70a17f51b7b30fec48a32e4f19ac15e261fd1a4
, ce qui n'estd1/b
pas le cas après le paiementd1/
.Notez que
root/root
etmybranch/mybranch
sont également manquants, mais les--depth 1
masquent dans la liste des fichiers manquants. Si vous supprimez--depth 1
, ils apparaissent sur la liste des fichiers manquants.la source
Vous pouvez le faire en
la source
Disons que le nom du fichier est 123.txt, cela fonctionne pour moi:
Si le fichier se trouve dans un répertoire A, assurez-vous de le spécifier correctement:
la source
Deux variantes de ce qui a déjà été proposé:
et:
Ceux-ci écrivent le fichier sur la sortie standard.
la source
Dans git, vous ne récupérez pas les fichiers avant de les mettre à jour - il semble que c'est ce que vous recherchez.
De nombreux systèmes comme clearcase, csv et ainsi de suite vous obligent à «extraire» un fichier avant de pouvoir y apporter des modifications. Git ne l'exige pas. Vous clonez un référentiel, puis apportez des modifications dans votre copie locale du référentiel.
Une fois que vous avez mis à jour les fichiers, vous pouvez faire:
Pour voir quels fichiers ont été modifiés. Vous ajoutez ceux avec lesquels vous souhaitez vous engager en
index
premier (index
c'est comme une liste à archiver):ou
Ensuite, do
git status
vous montrera quels fichiers ont été modifiés et lesquels sontindex
prêts à être validés ou archivés.Pour valider des fichiers dans votre copie du référentiel, procédez comme suit:
Consultez le
git
site Web pour des liens vers des manuels et des guides.la source
git format-patch
pour créer un patch pour la soumission (git format-patch -1
créera un patch pour votre dernier commit).Voici la solution complète pour extraire et pousser uniquement un fichier particulier à l'intérieur du référentiel git:
Voir également un lien pour des informations supplémentaires.
la source
Il semble que vous essayez de transmettre une idée du contrôle de version centralisé, ce qui n'est pas le cas par nature - il est distribué. Si vous souhaitez travailler avec un référentiel git, vous le clonez. Vous avez alors tout le contenu de l'arborescence de travail et tout l'historique (enfin, au moins tout ce qui mène à la pointe de la branche actuelle), pas seulement un seul fichier ou un instantané à partir d'un seul commit.
la source
Si vous avez besoin d'un fichier spécifique d'une branche spécifique d'un référentiel Git distant, la commande est:
Le reste peut être dérivé de la réponse de @ VonC:
Si vous avez besoin d'un fichier spécifique de la branche master c'est:
Si vous avez besoin d'un fichier spécifique à partir d'une balise, c'est:
la source
Je ne vois pas ce qui a fonctionné pour moi énuméré ici, donc je l'inclurai si quelqu'un se trouve dans ma situation.
Ma situation, j'ai un référentiel distant de peut-être 10 000 fichiers et j'ai besoin de créer un fichier RPM pour mon système Linux. La construction du RPM inclut un clone git de tout. Tout ce dont j'ai besoin, c'est d'un fichier pour démarrer la génération RPM. Je peux cloner l'arborescence source entière qui fait ce dont j'ai besoin, mais cela prend deux minutes supplémentaires pour télécharger tous ces fichiers lorsque tout ce dont j'ai besoin est un. J'ai essayé d'utiliser l'option d'archivage git discutée et j'ai eu «fatal: opération non prise en charge par le protocole». Il semble que je doive activer une sorte d’option d’archivage sur le serveur et mon serveur est entretenu par des voyous bureaucratiques qui semblent apprécier de compliquer les choses.
Ce que j'ai finalement fait, c'est que je suis entré dans l'interface Web de bitbucket et j'ai consulté le fichier dont j'avais besoin. J'ai fait un clic droit sur le lien pour télécharger une copie brute du fichier et sélectionné "copier le raccourci" dans la fenêtre contextuelle résultante. Je ne pouvais pas simplement télécharger le fichier brut car j'avais besoin d'automatiser les choses et je n'ai pas d'interface de navigateur sur mon serveur Linux.
Pour des raisons de discussion, cela a abouti à l'URL:
Je n'ai pas pu télécharger directement ce fichier à partir du référentiel bitbucket car je devais d'abord me connecter. Après avoir creusé un peu, j'ai trouvé que cela fonctionnait: Sous Linux:
Cette combinaison m'a permis de télécharger le fichier dont j'avais besoin pour construire tout le reste.
la source
J'ajoute cette réponse comme alternative à la vérification formelle ou à une opération locale similaire. En supposant que vous ayez accès à l'interface Web de votre fournisseur Git, vous pourrez peut-être visualiser directement n'importe quel fichier à un commit donné. Par exemple, sur GitHub, vous pouvez utiliser quelque chose comme:
Voici
ed25584f
les 8 premiers caractères du hachage SHA-1 de la validation d'intérêt, suivis du chemin d'accès au fichier source.De même, sur Bitbucket, nous pouvons essayer:
Dans ce cas, nous plaçons le hachage de validation à la fin de l'URL source.
la source
Si vous avez seulement besoin de télécharger le fichier, pas besoin de vérifier avec Git.
GitHub Mate est beaucoup plus facile à faire, c'est une extension Chrome, vous permet de cliquer sur l'icône du fichier pour le télécharger. également open source
la source
git
! =github
Si vous avez modifié une version locale d'un fichier et que vous souhaitez revenir à la version d'origine conservée sur le serveur central, cela peut être facilement réalisé à l'aide de Git Extensions .
Facile!
la source