Pobierz pojedynczy plik z repozytorium


221

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 git@github.com: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?


3
Aaw Bardzo by mi się podobało, gdyby istniał wbudowany sposób wykonania odpowiednika „cat-remote” i „tag-remote”.
conny

3
Mam ten sam problem. Chcę mieć ten sam plik licencji w 2 repozytoriach; edytować plik w 1 repozytorium, a następnie automatycznie zaktualizować kopię w drugim repozytorium.
GlassGhost 26.01.11

Odpowiedzi:


144

w wersji git 1.7.9.5 wydaje się, że to działa, aby wyeksportować pojedynczy plik ze zdalnego

git archive --remote=ssh://host/pathto/repo.git HEAD README.md

Spowoduje to przechwycenie zawartości pliku README.md.


27
... Tyle że nie działa w GitHub. Dang. :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard

13
Wydaje się, że to nie daje pliku surowego, ale raczej plik tar z jednym plikiem.
Frerich Raabe

20
@FrerichRaabe wystarczy dodać `| tar -x` do polecenia. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
ponownie

12
Możesz użyć tar -xOdo wyjścia do STDOUT w celu przesłania FILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
potoku

2
Dokładnie takiej odpowiedzi szukałem, ale otrzymuję komunikat „fatalny: Operacja nie jest obsługiwana przez protokół”. w odpowiedzi od Gita. Argh.
mhvelplund

68

Opierając się na Jakuba „s odpowiedź . git archivetworzy archiwum tar lub zip, więc musisz przesłać dane wyjściowe przez tar, aby uzyskać zawartość pliku:

git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x

Zapisuje kopię „nazwy pliku” z HEAD zdalnego repozytorium w bieżącym katalogu.

Ta :path/to/directoryczęść 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 --remoterepozytorió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


2
Jeśli jest to plik tekstowy i chcemy go zapisać w innej części, należy użyć: | tar -xO> ~ / destfile.ext
yucer

44

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:

$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -

Uwaga: przykład nie został przetestowany!
Jakub Narębski

7
W przypadku własnych repozytoriów musisz szczególnie włączyć przesyłanie archiwum, jeśli używasz git-daemon (url w stylu git: //) git config daemon.uploadarch truew zdalnym repozytorium. Domyślnie git demon wyłącza zdalne archiwum z komunikatem „fatal: remote error: odmowa dostępu lub repozytorium nie zostało wyeksportowane: ...”
patthoyts

+1 git archivePodejście to było moją pierwszą próbą - ale potem zauważyłem, że wymaganie tarna komputerze klienckim nie było dokładnie wygodne dla użytkowników systemu Windows. Skończyło się pobieranie z naszego lokalnego cgitserwera. Działa, ale nie jest tak szybki, jak bym tego chciał (i nadal wymaga działania unix2doslub podobnego działania na komputerach z systemem Windows, ponieważ przechowujemy pliki z zakończeniami linii uniksowych w repozytorium Git).
Frerich Raabe,

1
@FrerichRaabe Użyj -o fetched.zip. Zobacz także --format = <fmt> opcja.
akhan

5
Co do tego nie jest warte, nie wygląda na to, że działa to na repozytoriach hostowanych przez GitHub. Zobacz help.github.com/articles/can-i-archive-a-repository and groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

Nie ogólnie, ale jeśli używasz Github:

Dla mnie wgetsurowy 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 wgetlub curlna 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


3
Jest to najłatwiejsze rozwiązanie i działa na każdym surowym txt, jaki można znaleźć. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau

przykład wget nie działa, ale przykład curl działa.
Kyle Baker

Działa dobrze dla mnie. Czy wpisałeś swój adres URL w cudzysłowie w wierszu poleceń?
Ankur Agarwal,

to nie zachowuje historii
gitów

15

Aby wyeksportować pojedynczy plik ze zdalnego:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x

Spowoduje to pobranie pliku README.mddo bieżącego katalogu.

Jeśli chcesz, aby zawartość pliku została wyeksportowana do STDOUT:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO

Na końcu polecenia możesz podać wiele ścieżek.


9

Dla mnie wygląda to na rozwiązanie: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

gdzie 4oznacza cztery poprawki od teraz i ~jest tyldą, jak wspomniano w komentarzu.


Pamiętaj, aby zauważyć, że NIE jest to „znak minus” - „między” HEAD ”a„ 4 ”, ale„ tylda ”~ ~. Najwyraźniej nie czytałem wystarczająco dobrze git docs, albo moje okulary wymagają aktualizacji ;-)
Dennis

18
Wydaje się jednak, że nie pobiera pliku ze zdalnego repozytorium, tak jak potrzebuje OP.
Mike Weller

Lub: git show HEAD:./my_other_file > local_filejeśli pliku nie ma w katalogu głównym :)
kenorb

1
Uprzejma prośba dla wszystkich downvoters - proszę wyjaśnić i wyjaśnić, co nie jest OK - jesteśmy tutaj, aby uczyć się i dzielić :)
Mars Robertson

9
@MichalStefanow: Mike Weller ma to; w szczególności nie działa to w zdalnym repozytorium. Potrzebujesz przynajmniej lokalnego klona, ​​nawet jeśli masz na nim ustawione piloty.
Rob Howard,

6

używam tego

$ cat ~/.wgetrc
check_certificate = off

$ wget https://raw.github.com/jquery/jquery/master/grunt.js
HTTP request sent, awaiting response... 200 OK
Length: 11339 (11K) [text/plain]
Saving to: `grunt.js'

Działa dla mnie nawet bez poprawek wgetrc:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe

1
Moja wiadomość jest bardziej pomocna: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'.
Kos,

3
Działa to tylko w przypadku publicznych repozytoriów. W przypadku prywatnych repozytoriów potrzebujesz uwierzytelnienia.
Ricardo Otero,

5

Zróżnicowany wariant niektórych odpowiedzi tutaj, który odpowiada na pytanie PO:

git archive --remote=git@archive-accepting-git-server.com:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt

To nie działa, github nie obsługuje archiwum git.
Philipp Flenker,

2
Err .. git jest używany nie tylko w GitHub
Willem van Ketwich,

1
W swojej odpowiedzi wyraźnie ustawiłeś --remote na adres URL github ;-)
Philipp Flenker

1
Dziękujemy za opinię. Poprawiłem odpowiednio odpowiedź.
Willem van Ketwich,

2

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:

curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \
'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql

2

Rozwiązałem w ten sposób:

git archive --remote=ssh://git@gitlab.com/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name

Jeśli chcesz, możesz zastąpić „BranchName” słowem „HEAD”


2

Wydaje mi się, że najłatwiejszym sposobem jest skorzystanie z:

wget https://github.com/name/folder/file.zip?raw=true

1

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:

#!/bin/bash

BASENAME=$0

function usage {
    echo "usage: $BASENAME <remote-repo> <file> ..."
    exit 1
}

[ 2 -gt "$#" ] && { usage; }

REPO=$1
shift
FILES=$@

TMPFILE=`mktemp`.zip
git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE
unzip $TMPFILE
rm $TMPFILE

Działa to również z katalogami.


1

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. wprowadź opis zdjęcia tutaj

Następnie przeglądarka otworzy nową stronę z adresem URL zaczynającym się od https://raw.githubusercontent.com/ ...

wystarczy wpisać polecenie w terminalu:

#wget https://raw.githubusercontent.com/...

Po chwili plik zostanie umieszczony w folderze.


Tak, działa to również dobrze w Pythonie lub innych językach programowania z funkcją REST. Na przykład do pobierania modułów z różnych repozytoriów ..
Lars GJ

1

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:

 https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true

Na przykład:

 https://dev.azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1

Wymaga tokena API, prawda?
Jurij Pozniak

Zależy, w jaki sposób uruchamiasz API
Shayki Abramczyk

0

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.



0

dla bitbucket bezpośrednio z przeglądarki (korzystałem z safari ...) kliknij prawym przyciskiem myszy „Wyświetl Raw” i wybierz „Pobierz połączony plik”:

wprowadź opis zdjęcia tutaj


0

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

git-single-file () {
        if [ $# -lt 2 ]
        then
                echo "Usage: $0 <repo url> <file path>"
                return
        fi
        TEMP_DIR=$(mktemp -d)
        git clone $1 $TEMP_DIR
        cp $TEMP_DIR/$2 .
        rm -rf $TEMP_DIR
}

Ta odpowiedź może pomóc w rzadkim klonowaniu, czyli bez narzutu.
Yuriy Pozniak

0

Rozwiązanie Github Enterprise

HTTPS_DOMAIN=https://git.your-company.com
ORGANISATION=org
REPO_NAME=my-amazing-library
FILE_PATH=path/to/some/file
BRANCH=develop
GITHUB_PERSONAL_ACCESS_TOKEN=<your-access-token>

URL="${HTTPS_DOMAIN}/raw/${ORGANISATION}/${REPO_NAME}/${BRANCH}/${FILE_PATH}"

curl -H "Authorization: token ${GITHUB_PERSONAL_ACCESS_TOKEN}" ${URL} > "${FILE_PATH}"

Gdzie znajdujemy GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling

1
Możesz utworzyć osobisty token dostępu, przechodząc do https: // <twój_serwer> / ustawienia / tokeny i naciskając przycisk „Wygeneruj nowy token”.
Oliver Pearmain

Hmm, mamy automatyzacje, które otrzymują nazwę użytkownika i hasło, które są używane do uwierzytelniania się w wielu systemach, które używają tego samego logowania jednokrotnego, więc liczyłem na sposób automatyzacji generowania tokena na podstawie nazwy użytkownika i hasła.
ShadSterling

0

Jeśli Twoim celem jest tylko pobranie pliku, dostępna jest bezproblemowa aplikacja o nazwie gget:

gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'

Powyższy przykład pobierałby pojedynczy plik z hugorepozytorium.

https://github.com/dpb587/gget


-1

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:

wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>

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.

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.