Jaki jest najbardziej wydajny mechanizm (w odniesieniu do przesyłanych danych i wykorzystywanego miejsca na dysku), aby uzyskać zawartość jednego pliku ze zdalnego repozytorium git?
Do tej pory udało mi się wymyślić:
git clone --no-checkout --depth 1 [email protected]:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
To wciąż wydaje się przesadą.
Co powiesz na uzyskanie wielu plików z repozytorium?
git
git-checkout
sparse-checkout
git-sparse-checkout
dreftymac
źródło
źródło
Odpowiedzi:
w wersji git 1.7.9.5 wydaje się, że to działa, aby wyeksportować pojedynczy plik ze zdalnego
Spowoduje to przechwycenie zawartości pliku
README.md
.źródło
git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x
cat README.md
tar -xO
do wyjścia do STDOUT w celu przesłaniaFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
Opierając się na Jakuba „s odpowiedź .
git archive
tworzy archiwum tar lub zip, więc musisz przesłać dane wyjściowe przez tar, aby uzyskać zawartość pliku:Zapisuje kopię „nazwy pliku” z HEAD zdalnego repozytorium w bieżącym katalogu.
Ta
:path/to/directory
część jest opcjonalna. Jeśli zostanie wykluczone, pobrany plik zostanie zapisany w<current working dir>/path/to/directory/filename
Ponadto, jeśli chcesz umożliwić korzystanie z
git archive --remote
repozytoriów Git hostowanych przez git-daemon, musisz włączyć opcję konfiguracji daemon.uploadarch. Zobacz https://kernel.org/pub/software/scm/git/docs/git-daemon.htmlźródło
Jeśli wdrożony jest interfejs sieciowy (taki jak gitweb, cgit, Gitorious, ginatra), możesz go użyć do pobrania pojedynczego pliku (widok „surowy” lub „zwykły”).
Jeśli druga strona włączony go , można użyć git archiwum „s”
--remote=<URL>
'opcję (i ewentualnie ograniczyć je do katalogu podano rezyduje w pliku), na przykład:źródło
git config daemon.uploadarch true
w zdalnym repozytorium. Domyślnie git demon wyłącza zdalne archiwum z komunikatem „fatal: remote error: odmowa dostępu lub repozytorium nie zostało wyeksportowane: ...”git archive
Podejście to było moją pierwszą próbą - ale potem zauważyłem, że wymaganietar
na komputerze klienckim nie było dokładnie wygodne dla użytkowników systemu Windows. Skończyło się pobieranie z naszego lokalnegocgit
serwera. Działa, ale nie jest tak szybki, jak bym tego chciał (i nadal wymaga działaniaunix2dos
lub podobnego działania na komputerach z systemem Windows, ponieważ przechowujemy pliki z zakończeniami linii uniksowych w repozytorium Git).Nie ogólnie, ale jeśli używasz Github:
Dla mnie
wget
surowy adres URL okazał się najlepszym i najłatwiejszym sposobem na pobranie jednego konkretnego pliku.Otwórz plik w przeglądarce i kliknij przycisk „Raw”. Teraz odśwież przeglądarkę, skopiuj adres URL i zrób
wget
lubcurl
na nim.przykład wget:
wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py
Przykład zwijania:
curl 'https://example.com/raw.txt' > savedFile.txt
źródło
curl https://example.com/raw.txt > savedFile.txt
Aby wyeksportować pojedynczy plik ze zdalnego:
Spowoduje to pobranie pliku
README.md
do bieżącego katalogu.Jeśli chcesz, aby zawartość pliku została wyeksportowana do STDOUT:
Na końcu polecenia możesz podać wiele ścieżek.
źródło
Dla mnie wygląda to na rozwiązanie: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html
gdzie
4
oznacza cztery poprawki od teraz i~
jest tyldą, jak wspomniano w komentarzu.źródło
git show HEAD:./my_other_file > local_file
jeśli pliku nie ma w katalogu głównym :)używam tego
źródło
wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
ERROR: Certificate verification error for raw.github.com: unable to get local issuer certificate.
To connect to raw.github.com insecurely, use '--no-check-certificate'.
Zróżnicowany wariant niektórych odpowiedzi tutaj, który odpowiada na pytanie PO:
źródło
Jeśli repozytorium obsługuje tokeny (na przykład GitLab), wygeneruj token dla swojego użytkownika, a następnie przejdź do pliku, który chcesz pobrać, i kliknij plik wyjściowy RAW, aby uzyskać adres URL. Aby pobrać plik, użyj:
źródło
Rozwiązałem w ten sposób:
Jeśli chcesz, możesz zastąpić „BranchName” słowem „HEAD”
źródło
Wydaje mi się, że najłatwiejszym sposobem jest skorzystanie z:
źródło
Odpowiedź Izraela jest prosta, ale nie pozwala na kompresję. Możesz użyć
--format=zip
, ale nie możesz bezpośrednio rozpakować tego polecenia za pomocą polecenia potoku, tak jak możesz to zrobić przy pomocy tar, więc musisz zapisać go jako plik tymczasowy. Oto skrypt:Działa to również z katalogami.
źródło
W przypadku pojedynczego pliku wystarczy użyć polecenia wget.
Najpierw wykonaj poniższy rysunek, aby kliknąć „raw”, aby uzyskać adres URL, w przeciwnym razie pobierzesz kod osadzony w html.
Następnie przeglądarka otworzy nową stronę z adresem URL zaczynającym się od https://raw.githubusercontent.com/ ...
wystarczy wpisać polecenie w terminalu:
Po chwili plik zostanie umieszczony w folderze.
źródło
Jeśli Twoje repozytorium Git jest hostowane na platformie Azure-DevOps (VSTS), możesz pobrać pojedynczy plik za pomocą Rest API .
Format tego interfejsu API wygląda następująco:
Na przykład:
źródło
Używam curl, działa z repozytoriami publicznymi lub tymi wykorzystującymi podstawowe uwierzytelnianie https za pośrednictwem interfejsu sieciowego.
curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD
Przetestowałem to na github i bitbucket, działa na obu.
źródło
Jeśli chcesz pobrać plik z określonego skrótu + zdalnego repozytorium, próbowałem git-archive i to nie działało.
Będziesz musiał użyć git clone, a po sklonowaniu repozytorium będziesz musiał użyć git-archive, aby to działało.
Zadaję pytanie, jak to zrobić łatwiej w archiwum git z określonego skrótu ze zdalnego
źródło
dla bitbucket bezpośrednio z przeglądarki (korzystałem z safari ...) kliknij prawym przyciskiem myszy „Wyświetl Raw” i wybierz „Pobierz połączony plik”:
źródło
Jeśli nie masz nic przeciwko klonowaniu całego katalogu, ta mała funkcja bash / zsh zakończy się klonowaniem pojedynczego pliku w bieżącym katalogu (poprzez klonowanie repozytorium do katalogu tymczasowego i usuwanie go później).
Pro: Otrzymujesz tylko ten plik, który chcesz
Przeciw: wciąż musisz czekać na klonowanie całego repo
źródło
Rozwiązanie Github Enterprise
źródło
GITHUB_PERSONAL_ACCESS_TOKEN
?Jeśli Twoim celem jest tylko pobranie pliku, dostępna jest bezproblemowa aplikacja o nazwie
gget
:Powyższy przykład pobierałby pojedynczy plik z
hugo
repozytorium.https://github.com/dpb587/gget
źródło
Powiązane z odpowiedzią @Steven Penny, używam również wget. Ponadto, aby zdecydować, który plik wysłać dane wyjściowe, używam -O.
Jeśli używasz gitlabs, inną możliwością dla adresu URL jest:
O ile nie masz certyfikatu lub nie masz dostępu z zaufanego serwera do instalacji gitlabs, potrzebujesz - no-check-certificate, jak powiedział @Kos. Wolę to niż modyfikację .wgetrc, ale zależy to od twoich potrzeb.
Jeśli jest to duży plik, możesz rozważyć użycie opcji -c z wget. Aby móc kontynuować pobieranie pliku z miejsca, w którym go zostawiłeś, jeśli poprzednie zamierzenie nie powiodło się w środku.
źródło