Comment extraire un seul fichier d'un référentiel de serveur dans Git?


115

Je travaille sur un site avec un serveur exécutant Git. J'utilise Git pour le déploiement (pas GitHub). Cela a été mis en place avant mon implication en utilisant une méthode de hook , et j'ai fait référence à cette question et entré les commandes ci-dessous, mais cela n'a pas fonctionné.

Comment extraire un seul fichier du serveur? Par exemple, si je voulais mettre à jour mon fichier local index.php? git pull index.php?



Réponses:


195

Il est possible de faire (dans le référentiel déployé):

git fetch
// git fetch will download all the recent changes, but it will not put it in your current checked out code (working area).

Suivi par:

git checkout origin/master -- path/to/file
// git checkout <local repo name (default is origin)>/<branch name> -- path/to/file will checkout the particular file from the downloaded changes (origin/master).

1
Je vous remercie. Alors qu'entendez-vous par <revision>? le nom du fichier? Et si mon fichier est dans le répertoire racine, cela signifierait-il que je dois taper git checkout -m index.php index.php:?
vsvs

Merci pour l'explication.
vsvs

Doit-il provenir *origin*/masterou peut-il provenir de n'importe quelle télécommande? L'historique entier est-il intégré à mon dépôt ou le fichier semble-t-il apparaître comme par magie?
Bernhard Döbler

Si vous obtenez cette erreur "ne correspond à aucun fichier connu de git": "chemin / vers / fichier" ne doit pas être la copie du chemin que vous obtenez à partir de l'emplacement du fichier sur GitHub, ce qui signifie "repoName / fileName" , vous devez vous débarrasser de "repoName /" et cela fonctionnera.
Eduard

1
@ BernhardDöbler cela peut être n'importe quelle branche à distance :)
chrismillah

27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Cela suppose que vous extrayez le fichier d'origine / master.


13

Cela peut être la solution:

git fetch

git checkout origin/master -- FolderPathName/fileName

Merci.


5

Ce scénario se produit lorsque vous - ou des forces supérieures à vous - avez mutilé un fichier dans votre référentiel local et que vous souhaitez simplement restaurer une nouvelle copie de la dernière version de celui-ci à partir du référentiel. Supprimer simplement le fichier avec / bin / rm (pas git rm) ou le renommer / le masquer, puis émettre un git pullne fonctionnera pas: git remarque l'absence du fichier et suppose que vous voulez probablement qu'il disparaisse du dépôt ( git diffaffichera toutes les lignes supprimées du Fichier manquant).

git pullne pas restaurer les fichiers localement manquants m'a toujours frustré à propos de git, peut-être depuis que j'ai été influencé par d'autres systèmes de contrôle de version (par exemple svn update qui, je crois , restaurera les fichiers qui ont été cachés localement).

git reset --hard HEADest une autre façon de restaurer le fichier qui vous intéresse car il supprime toutes les modifications non validées que vous avez. Cependant, comme indiqué ici , git reset est une commande potentiellement dangereuse si vous avez d'autres modifications non validées qui vous intéressent.

La git fetch ... git checkoutstratégie notée ci-dessus par @chrismillah est un bon moyen chirurgical de restaurer le fichier en question.


1
beaucoup plus explicatif que les autres commentaires. Merci
Thecave3

3

Je cherchais une tâche légèrement différente, mais cela ressemble à ce que vous voulez:

git archive --remote=$REPO_URL HEAD:$DIR_NAME -- $FILE_NAME |
tar xO > /where/you/want/to/have.it

Je veux dire, si vous voulez aller chercher path/to/file.xz, vous définirez DIR_NAMEsur path/toet FILE_NAMEsur file.xz. Donc, vous vous retrouverez avec quelque chose comme

git archive --remote=$REPO_URL HEAD:path/to -- file.xz |
tar xO > /where/you/want/to/have.it

Et personne ne vous empêche de toute autre forme de déballage à la place tar xObien sûr (c'est moi qui ai besoin d'une pipe ici, ouais).


1

Essayez d'utiliser:

git checkout branchName -- fileName

Ex:

git checkout master -- index.php

2
Attention: "git checkout master - index.php" cela ne fait pas de checkout depuis le serveur, mais depuis la base de données git locale du dernier pull.
Roberto Novakosky

0
https://raw.githubusercontent.com/[USER-NAME]/[REPOSITORY-NAME]/[BRANCH-NAME]/[FILE-PATH]

Ex. https://raw.githubusercontent.com/vipinbihari/apana-result/master/index.php

Grâce à cela, vous obtiendrez le contenu d'un fichier individuel sous forme de texte de ligne. Vous pouvez télécharger ce texte avec wget.

Ex. https://raw.githubusercontent.com/vipinbihari/apana-result/master/index.php


1
L'OP a spécifiquement indiqué dans la question qu'il n'utilise pas github.
Zeitounator

0

Ce lot Windows fonctionne indépendamment du fait qu'il soit sur GitHub ou non. Je l'utilise car il montre quelques mises en garde. Vous remarquerez que l'opération est lente et traverse des centaines de mégaoctets de données , n'utilisez donc pas cette méthode si vos besoins sont basés sur la bande passante disponible / la mémoire RW.

sparse_checkout.bat

pushd "%~dp0"
if not exist .\ms-server-essentials-docs mkdir .\ms-server-essentials-docs
pushd .\ms-server-essentials-docs
git init
git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git
git config core.sparseCheckout true
(echo EssentialsDocs)>>.git\info\sparse-checkout
git pull origin master

=>

C: \ Users \ nom d'utilisateur \ Desktop> sparse_checkout.bat

C: \ Users \ nom d'utilisateur \ Desktop> pushd "C: \ Users \ nom d'utilisateur \ Desktop \"

C: \ Users \ nom d'utilisateur \ Desktop> s'il n'existe pas. \ Ms-server-essentials-docs mkdir. \ Ms-server-essentials-docs

C: \ Users \ nom d'utilisateur \ Desktop> pushd. \ Ms-server-essentials-docs

C: \ Users \ user name \ Desktop \ ms-server-essentials-docs> git init Référentiel Git vide initialisé dans C: / Users / user name / Desktop / ms-server-essentials-docs / .git /

C: \ Users \ user name \ Desktop \ ms-server-essentials-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git Mise à jour de l'origine remote: énumération des objets: 97, terminé. remote: comptage des objets: 100% (97/97), terminé. remote: Compression d'objets: 100% (44/44), terminé. remote: Total 145517 (delta 63), réutilisé 76 (delta 53), pack-réutilisé 145420 Réception d'objets: 100% (145517/145517), 751,33 Mio | 32,06 Mio / s, terminé. Résolution des deltas: 100% (102110/102110), terminé. Depuis https://github.com/MicrosoftDocs/windowsserverdocs * [nouvelle branche]
1106-conflict -> origin / 1106-conflict * [nouvelle branche]
FromPrivateRepo -> origin / FromPrivateRepo * [nouvelle branche] conflictfix -> origin / conflictfix * [nouvelle branche]
PR183 -> origin / PR183 * [nouvelle branche]

eross-msft-patch-1 -> origin / eross-msft-patch-1 * [nouvelle branche]
maître -> origine / maître * [nouvelle branche] patch-1
-> origin / patch-1 * [nouvelle branche] repo_sync_working_branch -> origin / repo_sync_working_branch * [nouvelle branche]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [nouvelle branche]
shortpatti-patch-2 -> origin / shortpatti -patch-2 * [nouvelle branche]
shortpatti-patch-3 -> origin / shortpatti-patch-3 * [nouvelle branche]
shortpatti-patch-4 -> origin / shortpatti-patch-4 * [nouvelle branche]
shortpatti-patch -5 -> origin / shortpatti-patch-5 * [nouvelle branche]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [nouvelle branche]
shortpatti-patch-7 -> origin / shortpatti-patch-7 * [nouvelle branche]
shortpatti-patch-8 -> origin / shortpatti-patch-8

C: \ Users \ nom d'utilisateur \ Desktop \ ms-server-essentials-docs> git config core.sparseCheckout true

C: \ Users \ nom d'utilisateur \ Desktop \ ms-server-essentials-docs> (echo EssentialsDocs) 1 >>. Git \ info \ sparse-checkout

C: \ Users \ user name \ Desktop \ ms-server-essentials-docs> git pull origin master
De https://github.com/MicrosoftDocs/windowsserverdocs
* branch master -> FETCH_HEAD

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.