Jak mogę pobrać tylko jeden plik z repozytorium git?
git
file
git-checkout
sparse-checkout
Arthur Ulfeldt
źródło
źródło
Odpowiedzi:
Początkowo wspominałem w 2012 roku
git archive
(patrz Jared Forsytha 's odpowiedź i Robert Rycerz ' s odpowiedź ), ponieważ git1.7.9.5 (marzec 2012) , Paul Brannan jest odpowiedź :Ale: w 2013 r. Nie było to już możliwe w przypadku zdalnych adresów URL https://github.com .
Zobacz starą stronę „ Czy mogę zarchiwizować repozytorium? ”
Bieżąca strona (2018) „ Informacje o archiwizowaniu treści i danych w GitHub ” zaleca korzystanie z usług stron trzecich, takich jak GHTorrent lub GH Archive .
Możesz więc poradzić sobie z lokalnymi kopiami / klonami:
Alternatywnie możesz wykonać następujące czynności, jeśli masz lokalną kopię nagiego repozytorium, jak wspomniano w tej odpowiedzi ,
Lub musisz najpierw sklonować repo, co oznacza, że masz pełną historię: - w repozytorium .git - w działającym drzewie.
git config core.sparsecheckout true
).git/info/sparse-checkout
plikuAby ponownie przeczytać działające drzewo:
W ten sposób powstaje działające drzewo zawierające dokładnie to, czego chcesz (nawet jeśli jest to tylko jeden plik)
Richard Gomes wskazuje ( w komentarzach ) na „ Jak sklonować, pobrać lub rozdzielić kasę pojedynczy katalog lub listę katalogów z repozytorium git? ”
źródło
git archive
teraz użyć .Najpierw sklonuj repozytorium z opcją -n, która eliminuje domyślne pobieranie wszystkich plików, oraz z opcją --depth 1, co oznacza, że pobiera tylko najnowszą wersję każdego pliku
Następnie sprawdź tylko taki plik, który chcesz:
źródło
-n
drzewem pracy i indeksem zsynchronizowanym. Oznacza to, że cała treść jest wyświetlana jako usunięta. Trzeba albogit reset HEAD
albogit checkout HEAD file
. W tym momencie bardzo trudno jest pracować z repozytorium, chyba że naprawdę rozumiesz, jak działa git.rm -rf .git
do skryptu NickMoore wyczyści wszystkie ślady sklonowanego repo i być może rozwiąże obawy Jefromiego o posiadanie trudnego w użyciu repozytorium. Sprawia, że jest to bardzo przydatne dla wielu aplikacji, takich jak moje dzisiejsze wyzwanie, aby zbudować hak po odbiorze, aby automatycznie zaktualizować wersję innego haka po odbiorze.git
nie jest najlepsza dla tego rodzaju pracy). Ta odpowiedź jest ważna również na to pytanie lub na inne popularne i wiele innych: zmieńname_of_file
naname_of_folder
. Git w dzisiejszych czasach (2014s) oferuje podmoduły właścicielowi repozytorium, oferując przyjazną dla użytkowników repo.Jeśli masz już kopię repozytorium git, zawsze możesz pobrać wersję pliku za pomocą a,
git log
aby znaleźć identyfikator skrótu (na przykład 3cdc61015724f9965575ba954c8cd4232c8b42e4), a następnie po prostu wpisz:Oto rzeczywisty przykład:
źródło
path-to-file
jest to katalog, a bieżącyHEAD
zawiera określony plik, atarget
nie zawiera go (lub odwrotnie), plik nie zostanie poprawnie zaktualizowany. Czy istnieje sposób, aby sobie z tym poradzić?Zwykle nie można pobrać tylko jednego pliku
git
bez pobrania całego repozytorium, jak sugerowano w pierwszej odpowiedzi. To dlatego, że Git nie przechowuje plików tak, jak myślisz (jak CVS / SVN), ale generuje je na podstawie całej historii projektu.Ale istnieją pewne obejścia dla konkretnych przypadków. Poniższe przykłady zastępcze o
user
,project
,branch
,filename
.GitHub
GitLab
GitWeb
Jeśli korzystasz z Git na serwerze - GitWeb , możesz spróbować na przykład (zmienić na właściwą ścieżkę):
GitWeb na drupalcode.org
Przykład:
googlesource.com
Istnieje nieudokumentowana funkcja, która pozwala pobrać wersje nieprzetworzonych plików w formacie base64:
W innych przypadkach sprawdź, czy Twoje repozytorium Git używa interfejsów internetowych.
Jeśli to nie za pomocą dowolnego interfejsu internetowego, można rozważyć pchnąć swój kod z usługami zewnętrznymi, takimi jak GitHub , Bitbucket , itp . i użyj go jako lustra.
Jeśli nie masz
wget
zainstalowanej, spróbujcurl -O (url)
alternatywnie.źródło
wget
odpowiedź, a powróci prostota i szczęście. Dzięki stary.git checkout branch_or_version - ścieżka / plik
przykład:
git checkout HEAD -- main.c
źródło
Minimalny przewodnik
git checkout -- <filename>
Patrz: https://git-scm.com/docs/git-checkout
Dup: Cofnąć modyfikacje kopii roboczej jednego pliku w Git?
źródło
git-checkout
.Teraz możemy! Ponieważ jest to pierwszy wynik w Google, pomyślałem, że zaktualizuję to do najnowszej wersji. Wraz z pojawieniem się git 1.7.9.5 mamy
git archive
polecenie, które pozwoli ci pobrać pojedynczy plik ze zdalnego hosta.Zobacz pełną odpowiedź tutaj https://stackoverflow.com/a/5324532/290784
źródło
github.com
HEAD
czymaster
nieHEAD:directory
.git archive [email protected]:user/repo branch:path/to file | tar -x
Praca w GIT 1.7.2.2
Na przykład masz zdalny some_remote z oddziałami oddział 1 , oddział 32
więc aby pobrać konkretny plik, wywołuje się następujące polecenia:
na przykład będzie to coś takiego
To polecenie pobierania skopiuje całą strukturę plików conf / en i conf / fr do bieżącego katalogu, w którym wywołujesz te polecenia (oczywiście zakładam, że wcześniej uruchomiłeś git init)
źródło
git fetch some_remote
wcześniej, prawda?Bardzo prosta:
To nie będzie kasować
from-branch-name
oddziału. Pozostaniesz w dowolnej gałęzi, w której się znajdujesz, i tylko ten pojedynczy plik zostanie pobrany z określonej gałęzi.Oto odpowiednia część strony man dla
git-checkout
Czapka dla Ariejana de Vrooma, który nauczył mnie tego z tego postu na blogu .
źródło
git clone --filter
z Git 2.19Ta opcja faktycznie pomija pobieranie większości niepotrzebnych obiektów z serwera:
Serwer powinien być skonfigurowany z:
Począwszy od wersji 2.19.0 nie ma obsługi serwera, ale można ją już przetestować lokalnie.
DO ZROBIENIA:
--filter=blob:none
pomija wszystkie obiekty BLOB, ale nadal pobiera wszystkie obiekty drzewa. Ale przy normalnym repo powinno to być małe w porównaniu do samych plików, więc jest to już wystarczająco dobre. Zapytano pod adresem : https://www.spinics.net/lists/git/msg342006.html Devs odpowiedział--filter=tree:0
jest w przygotowaniu.Pamiętaj, że to
--depth 1
już sugeruje--single-branch
, zobacz także: Jak sklonować pojedynczy oddział w Git?file://$(path)
jest wymagane do przezwyciężeniagit clone
protokołu shenanigans: Jak płytko sklonować lokalne repozytorium git za pomocą ścieżki względnej?Format
--filter
jest udokumentowany naman git-rev-list
.Rozszerzono zdalny protokół Git w celu obsługi tej funkcji.
Dokumenty na drzewie Git:
Przetestuj to
GitHub w górę .
Dane wyjściowe w Git v2.19.0:
Wnioski:
d1/a
brakuje wszystkich obiektów blob z wyjątkiem . Na przykładf70a17f51b7b30fec48a32e4f19ac15e261fd1a4
, co jestd1/b
, nie jest tam po sprawdzeniud1/
.Zauważ, że
root/root
imybranch/mybranch
również ich brakuje, ale--depth 1
ukrywa to na liście brakujących plików. Jeśli usuniesz--depth 1
, zostaną one wyświetlone na liście brakujących plików.źródło
Możesz to zrobić przez
źródło
Powiedzmy, że nazwa pliku to 123.txt, to działa dla mnie:
Jeśli plik znajduje się w katalogu A, upewnij się, że podałeś go poprawnie:
źródło
Dwa warianty tego, co już podano:
i:
Zapisują one plik na standardowe wyjście.
źródło
W git nie „kasujesz” plików przed ich aktualizacją - wygląda na to, że właśnie tego szukasz.
Wiele systemów, takich jak clearcase, csv itd., Wymaga „pobrania” pliku, zanim będzie można wprowadzić do niego zmiany. Git tego nie wymaga. Klonujesz repozytorium, a następnie wprowadzasz zmiany w lokalnej kopii repozytorium.
Po zaktualizowaniu plików możesz:
Aby zobaczyć, które pliki zostały zmodyfikowane. Dodajesz te, które chcesz
index
najpierw zatwierdzić (index
przypomina listę do sprawdzenia):lub
Następnie
git status
pokaże, które pliki zostały zmodyfikowane, a które sąindex
gotowe do zatwierdzenia lub zalogowania.Aby zatwierdzić pliki w kopii repozytorium:
Zobacz
git
stronę internetową zawierającą łącza do instrukcji i przewodników.źródło
git format-patch
aby utworzyć łatkę do przesłania (git format-patch -1
utworzy łatkę tylko ostatnie zatwierdzenie).Oto kompletne rozwiązanie do pobierania i przesyłania tylko określonego pliku w repozytorium git:
Zobacz także link, aby uzyskać dodatkowe informacje.
źródło
Wygląda na to, że próbujesz przenieść pomysł ze scentralizowanej kontroli wersji, której git z natury nie ma - jest rozpowszechniany. Jeśli chcesz pracować z repozytorium git, sklonuj je. Następnie masz całą zawartość drzewa roboczego i całą historię (cóż, przynajmniej wszystko prowadzące do końca bieżącej gałęzi), a nie tylko pojedynczy plik lub migawkę z pojedynczego zatwierdzenia.
źródło
Jeśli potrzebujesz określonego pliku z określonej gałęzi ze zdalnego repozytorium Git, polecenie to:
Resztę można uzyskać z odpowiedzi @ VonC:
Jeśli potrzebujesz określonego pliku z gałęzi master, jest to:
Jeśli potrzebujesz określonego pliku z tagu, jest to:
źródło
Nie widzę tu, co dla mnie zadziałało, więc dołączę to, jeśli ktoś będzie w mojej sytuacji.
W mojej sytuacji mam zdalne repozytorium może z 10 000 plików i muszę zbudować plik RPM dla mojego systemu Linux. Kompilacja RPM zawiera git-klon wszystkiego. Potrzebuję tylko jednego pliku, aby rozpocząć kompilację RPM. Mogę sklonować całe drzewo źródłowe, które robi to, czego potrzebuję, ale pobranie wszystkich tych plików zajmuje dodatkowe dwie minuty, gdy wszystko, czego potrzebuję, to jeden. Próbowałem użyć omówionej opcji archiwum git i otrzymałem komunikat „Fatal: Operacja nie jest obsługiwana przez protokół”. Wygląda na to, że muszę włączyć opcję archiwizacji na serwerze, a mój serwer jest utrzymywany przez biurokratycznych bandytów, którzy wydają się lubić utrudnianie wykonywania zadań.
W końcu zrobiłem to, gdy wszedłem do interfejsu sieciowego dla bitbucket i przejrzałem jeden plik, którego potrzebowałem. Zrobiłem prawym przyciskiem myszy link, aby pobrać nieprzetworzoną kopię pliku i wybrałem „skrót do kopiowania” z wynikowego wyskakującego okienka. Nie mogłem po prostu pobrać nieprzetworzonego pliku, ponieważ musiałem zautomatyzować różne rzeczy i nie mam interfejsu przeglądarki na moim serwerze Linux.
Ze względu na dyskusję powstał adres URL:
Nie mogłem bezpośrednio pobrać tego pliku z repozytorium bitbucket, ponieważ najpierw musiałem się zalogować. Po krótkim kopaniu okazało się, że zadziałało: W systemie Linux:
Ta kombinacja pozwoliła mi pobrać jeden plik, którego potrzebowałem, aby zbudować wszystko inne.
źródło
Dodaję tę odpowiedź jako alternatywę dla formalnej kasy lub innej podobnej operacji lokalnej. Zakładając, że masz dostęp do interfejsu internetowego swojego dostawcy Git, możesz być w stanie bezpośrednio wyświetlić dowolny plik przy danym żądanym zatwierdzeniu. Na przykład w GitHub możesz użyć czegoś takiego:
Oto
ed25584f
pierwsze 8 znaków z skrótu SHA-1 interesującego zatwierdzenia, a następnie ścieżka do pliku źródłowego.Podobnie, na Bitbucket możemy wypróbować:
W takim przypadku umieszczamy skrót zatwierdzenia na końcu źródłowego adresu URL.
źródło
Jeśli potrzebujesz tylko pobrać plik, nie musisz sprawdzać w Git.
GitHub Mate jest o wiele łatwiejszy, jest to rozszerzenie do Chrome, umożliwia kliknięcie ikony pliku, aby go pobrać. także open source
źródło
git
! =github
Jeśli edytowałeś lokalną wersję pliku i chcesz przywrócić oryginalną wersję utrzymywaną na centralnym serwerze, możesz to łatwo osiągnąć za pomocą rozszerzeń Git .
Łatwy!
źródło