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?



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).

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.


13

Esta pode ser a solução:

git fetch

git checkout origin/master -- FolderPathName/fileName

Obrigado.


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.


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).


1

Tente usar:

git checkout branchName -- fileName

Ex:

git checkout master -- index.php

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.