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?



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

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.



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.


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


1

Spróbuj użyć:

git checkout branchName -- fileName

Dawny:

git checkout master -- index.php

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.