Jak pobrać pojedynczy plik z repozytorium serwera w Git?

115

Pracuję w witrynie z serwerem z systemem Git. Używam Git do wdrożenia (nie GitHub). Zostało to ustawione przed moim zaangażowaniem przy użyciu metody zaczepienia i odniosłem się do tego pytania i wprowadziłem poniższe polecenia, ale nie zadziałało.

Jak mogę pobrać pojedynczy plik z serwera? Na przykład, gdybym chciał zaktualizować mój lokalny plik index.php? git pull index.php?

vsvs
źródło
1
Możliwy duplikat Czy można pobrać tylko jeden plik w Git?
Mateusz Piotrowski
Możliwy duplikat Jak pobrać tylko jeden plik z repozytorium git?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

195

Możliwe jest wykonanie (we wdrożonym repozytorium):

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

Śledzony przez:

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
źródło
1
Dziękuję Ci. Więc co masz na myśli <revision>? nazwa pliku? A jeśli mój plik znajduje się w katalogu głównym, czy to oznacza, że ​​muszę wpisać git checkout -m index.php index.php:?
vsvs
Dziękuję za wyjaśnienie.
vsvs
Czy to musi być, *origin*/masterczy może to być z dowolnego odległego miejsca? Czy cała historia jest wciągnięta do mojego repozytorium, czy plik wydaje się pojawiać magicznie?
Bernhard Döbler
Jeśli pojawi się ten błąd „nie pasuje do żadnego pliku (ów) znanych z git”: „ścieżka / do / pliku” nie powinna być kopią ścieżki, którą otrzymujesz z lokalizacji pliku w GitHub, co oznacza „nazwa_ repozytorium / nazwa_pliku” , powinieneś pozbyć się "repoName /" i wtedy zadziała.
Eduard
1
@ BernhardDöbler może to być dowolny oddział z odległego :)
chrismillah
27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Zakłada się, że pobierasz plik z źródła / wzorca.

OYORF
źródło
13

Może to być rozwiązanie:

git fetch

git checkout origin/master -- FolderPathName/fileName

Dzięki.

Y. Joy Ch. Singha
źródło
5

Ten scenariusz pojawia się, gdy Ty - lub siły większe od ciebie - zniekształciłeś plik w lokalnym repozytorium i chcesz po prostu przywrócić nową kopię najnowszej wersji z repozytorium. Wystarczy usunąć plik za pomocą / bin / rm (nie git rm) lub zmienić jego nazwę / ukryć, a następnie wydać polecenie git pullnie zadziała: git zauważa nieobecność pliku i zakłada, że ​​prawdopodobnie chcesz go git diffusunąć z repozytorium ( pokaże wszystkie linie usunięte z brakujący plik).

git pullnie przywracając lokalnie brakujące pliki zawsze sfrustrowany mi o git, ponieważ może być pod wpływem innych systemów kontroli wersji (np svn aktualizację , która wierzę będzie przywrócić pliki, które zostały ukryte lokalnie).

git reset --hard HEADto alternatywny sposób przywracania interesującego nas pliku, ponieważ odrzuca wszelkie niezatwierdzone zmiany. Jednak, jak wspomniano tutaj , reset git jest potencjalnie niebezpiecznym poleceniem, jeśli masz inne niezatwierdzone zmiany, na których Ci zależy.

git fetch ... git checkoutStrategia wspomniano wyżej przez @chrismillah jest dobry sposób chirurgiczny, aby przywrócić plik w pytaniu.

Trutane
źródło
1
dużo bardziej wymowne niż komentarze innych. Dziękuję
Thecave3
3

Szukałem nieco innego zadania, ale wygląda to tak, jak chcesz:

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

To znaczy, jeśli chcesz pobrać path/to/file.xz, zostanie ustawiony DIR_NAMEna path/toi FILE_NAMEna file.xz. Więc skończysz z czymś takim

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

I nikt nie powstrzymuje cię przed jakąkolwiek inną formą rozpakowywania zamiast tar xOoczywiście (to ja potrzebowałem tutaj fajki, tak).

jno
źródło
1

Spróbuj użyć:

git checkout branchName -- fileName

Dawny:

git checkout master -- index.php
Dodda Venkata
źródło
2
Uwaga: "git checkout master - index.php" to nie robi checkout z serwera, ale z lokalnej bazy danych git z ostatniego ściągnięcia.
Roberto Novakosky
0

Ta partia systemu Windows działa niezależnie od tego, czy jest w serwisie GitHub. Używam go, ponieważ pokazuje pewne ostre zastrzeżenia. Zauważysz, że operacja jest powolna i obejmuje setki megabajtów danych , więc nie używaj tej metody, jeśli Twoje wymagania są oparte na dostępnej przepustowości / pamięci 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 \ nazwa użytkownika \ Desktop> sparse_checkout.bat

C: \ Users \ nazwa użytkownika \ Desktop> pushd "C: \ Users \ nazwa użytkownika \ Desktop \"

C: \ Users \ nazwa użytkownika \ Desktop> jeśli nie istnieje. \ Ms-server-essentials-docs mkdir. \ Ms-server-essentials-docs

C: \ Users \ nazwa użytkownika \ Desktop> pushd. \ Ms-server-essentials-docs

C: \ Users \ nazwa użytkownika \ Desktop \ ms-server-essentials-docs> git init Zainicjowano puste repozytorium Git w C: / Users / nazwa użytkownika / Desktop / ms-server-essentials-docs / .git /

C: \ Users \ nazwa użytkownika \ Desktop \ ms-server-essentials-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git Aktualizowanie pochodzenia zdalnego: wyliczanie obiektów: 97, gotowe. zdalne: Liczenie obiektów: 100% (97/97), gotowe. zdalne: Kompresja obiektów: 100% (44/44), gotowe. zdalne: Ogółem 145517 (delta 63), ponownie wykorzystane 76 (delta 53), ponownie wykorzystane w opakowaniu 145420 Odbierane obiekty: 100% (145517/145517), 751,33 MiB | 32,06 MiB / s, gotowe. Rozwiązywanie delt: 100% (102110/102110), gotowe. Od https://github.com/MicrosoftDocs/windowsserverdocs * [nowa gałąź]
1106-konflikt -> pochodzenie / 1106-konflikt * [nowa gałąź]
FromPrivateRepo -> origin / FromPrivateRepo * [nowa gałąź]
PR183 -> origin / PR183 * [Nowa gałąź]
konflikt -> pochodzenie / konflikt * [nowa gałąź]
eross-msft-patch-1 -> origin / eross-msft-patch-1 * [nowa gałąź]
master -> origin / master * [nowa gałąź] patch-1
-> origin / patch-1 * [nowa gałąź] repo_sync_working_branch -> origin / repo_sync_working_branch * [nowa gałąź]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [nowa gałąź]
shortpatti-patch-2 -> origin / shortpatti -patch-2 * [nowa gałąź]
shortpatti-patch-3 -> origin / shortpatti-patch-3 * [nowa gałąź]
shortpatti-patch-4 -> origin / shortpatti-patch-4 * [nowa gałąź]
shortpatti-patch -5 -> origin / shortpatti-patch-5 * [nowa gałąź]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [nowa gałąź]
shortpatti-patch-7 -> origin / shortpatti-patch-7 * [nowa gałąź]
shortpatti-patch-8 -> origin / shortpatti-patch-8

C: \ Users \ nazwa użytkownika \ Desktop \ ms-server-essentials-docs> git config core.sparseCheckout true

C: \ Users \ nazwa użytkownika \ Desktop \ ms-server-essentials-docs> (echo EssentialsDocs) 1 >>. Git \ info \ sparse-checkout

C: \ Users \ nazwa użytkownika \ Desktop \ ms-server-essentials-docs> git pull origin master
From https://github.com/MicrosoftDocs/windowsserverdocs
* branch master -> FETCH_HEAD

kayleeFrye_onDeck
źródło