Como puxar um único arquivo de um repositório de servidor no Git?

114

Estou trabalhando em um site com um servidor executando Git. Estou usando o Git para implantação (não o GitHub). Isso foi configurado antes de meu envolvimento usando um método de gancho e me referi a essa questão e digitei os comandos abaixo, mas não funcionou.

Como faço para obter um único arquivo do servidor? Por exemplo, se eu quisesse atualizar meu arquivo local index.php? git pull index.php?

vsvs
fonte
1
Possível duplicata de É possível puxar apenas um arquivo no Git?
Mateusz Piotrowski
Possível duplicata de Como fazer check-out de apenas um arquivo do repositório git?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

194

É possível fazer (no repositório implantado):

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

Seguido por:

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).
chrismillah
fonte
1
Obrigado. Então, o que você quer dizer <revision>? o nome do arquivo? E se meu arquivo estiver no diretório raiz, isso significa que tenho que digitar git checkout -m index.php index.php:?
vsvs
Obrigado pela explicação.
vsvs
Precisa ser *origin*/masterou pode ser de qualquer lugar remoto? Todo o histórico é colocado em meu repositório ou o arquivo parece aparecer magicamente?
Bernhard Döbler
Se você receber este erro "não correspondeu a nenhum arquivo conhecido por git": "caminho / para / arquivo" não deve ser a cópia do caminho que você obteve do local do arquivo no GitHub, significando "repoName / fileName" , você deve se livrar de "repoName /" e então ele funcionará.
Eduard de
1
@ BernhardDöbler pode ser qualquer branch remoto :)
chrismillah
27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Isso pressupõe que você está puxando o arquivo da origem / mestre.

OYORF
fonte
13

Esta pode ser a solução:

git fetch

git checkout origin/master -- FolderPathName/fileName

Obrigado.

Y. Joy Ch. Singha
fonte
5

Este cenário surge quando você - ou forças superiores a você - mutilou um arquivo em seu repositório local e deseja apenas restaurar uma nova cópia da versão mais recente dele a partir do repositório. Simplesmente deletar o arquivo com / bin / rm (não git rm) ou renomear / ocultar e então emitir um git pullnão funcionará: git nota a ausência do arquivo e assume que você provavelmente quer que ele saia do repositório ( git diffmostrará todas as linhas deletadas do arquivo desaparecido).

git pullnão restaurar arquivos ausentes localmente sempre me frustrou sobre o git, talvez desde que fui influenciado por outros sistemas de controle de versão (por exemplo, svn update que acredito que irá restaurar arquivos que foram escondidos localmente).

git reset --hard HEADé uma maneira alternativa de restaurar o arquivo de interesse, pois ele descarta todas as alterações não confirmadas que você possui. No entanto, conforme observado aqui , git reset é um comando potencialmente perigoso se você tiver qualquer outra alteração não confirmada de seu interesse.

A git fetch ... git checkoutestratégia observada acima por @chrismillah é uma boa maneira cirúrgica de restaurar o arquivo em questão.

Trutane
fonte
1
muito mais explicativo do que os outros comentários. Obrigado
Thecave3
3

Estava procurando uma tarefa um pouco diferente, mas parece o que você quer:

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

Quero dizer, se você deseja buscar path/to/file.xz, você definirá DIR_NAMEcomo path/toe FILE_NAMEcomo file.xz. Então, você vai acabar com algo como

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

E ninguém impede você de qualquer outra forma de desempacotar ao invés, é tar xOclaro (fui eu quem precisa de um cachimbo aqui, sim).

jno
fonte
1

Tente usar:

git checkout branchName -- fileName

Ex:

git checkout master -- index.php
Dodda Venkata
fonte
2
Atenção: "git checkout master - index.php" não faz o checkout do servidor, mas sim do banco de dados git local do último pull.
Roberto Novakosky
0

Este lote do Windows funciona independentemente de estar ou não no GitHub. Estou usando porque mostra algumas advertências gritantes. Você notará que a operação é lenta e percorre centenas de megabytes de dados , portanto, não use esse método se seus requisitos forem baseados na largura de banda / memória RW disponível.

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: \ Usuários \ nome do usuário \ Desktop> sparse_checkout.bat

C: \ Usuários \ nome do usuário \ Área de trabalho> pushd "C: \ Usuários \ nome do usuário \ Área de trabalho \"

C: \ Usuários \ nome do usuário \ Desktop> se não existir. \ Ms-server-essentials-docs mkdir. \ Ms-server-essentials-docs

C: \ Usuários \ nome do usuário \ Desktop> pushd. \ Ms-server-essentials-docs

C: \ Usuários \ nome do usuário \ Desktop \ ms-server-essentials-docs> git init Repositório Git vazio inicializado em C: / Usuários / nome do usuário / Desktop / ms-server-essentials-docs / .git /

C: \ Users \ nome do usuário \ Desktop \ ms-server-essentials-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git Atualizando origem remota: Enumerando objetos: 97, concluído. remoto: Contando objetos: 100% (97/97), concluído. remoto: Comprimir objetos: 100% (44/44), pronto. remoto: Total 145517 (delta 63), reutilizado 76 (delta 53), embalagem reutilizada 145420 Objetos de recebimento: 100% (145517/145517), 751,33 MiB | 32,06 MiB / s, concluído. Resolvendo deltas: 100% (102110/102110), concluído. De https://github.com/MicrosoftDocs/windowsserverdocs * [novo ramo]
1106-conflito -> origin / 1106-conflito * [novo ramo]
FromPrivateRepo -> origin / FromPrivateRepo * [novo ramo]
PR183 -> origin / PR183 * [nova filial]
conflitofix -> origin / conflitofix * [novo ramo]
eross-msft-patch-1 -> origin / eross-msft-patch-1 * [novo ramo]
master -> origin / master * [novo ramo] patch-1
-> origin / patch-1 * [novo ramo] repo_sync_working_branch -> origin / repo_sync_working_branch * [novo ramo]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [novo ramo]
shortpatti-patch-2 -> origin / shortpatti -patch-2 * [novo ramo]
shortpatti-patch-3 -> origin / shortpatti-patch-3 * [novo ramo]
shortpatti-patch-4 -> origin / shortpatti-patch-4 * [novo ramo]
shortpatti-patch -5 -> origin / shortpatti-patch-5 * [novo ramo]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [novo ramo]
shortpatti-patch-7 -> origin / shortpatti-patch-7 * [novo ramo]
shortpatti-patch-8 -> origin / shortpatti-patch-8

C: \ Usuários \ nome do usuário \ Desktop \ ms-server-essentials-docs> git config core.sparseCheckout true

C: \ Users \ user name \ Desktop \ ms-server-essentials-docs> (echo EssentialsDocs) 1 >>. Git \ info \ sparse-checkout

C: \ Usuários \ nome de usuário \ Desktop \ ms-server-essentials-docs> git pull origin master
De https://github.com/MicrosoftDocs/windowsserverdocs
* branch master -> FETCH_HEAD

kayleeFrye_onDeck
fonte