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 [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?

dreftymac
źródło
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
Możliwy duplikat Jak pobrać tylko jeden plik z repozytorium git?
Ciro Santilli 30 冠状 病 六四 事件 法轮功

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.

Israel Dov
źródło
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

Robert Knight
źródło
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 [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -
Jakub Narębski
źródło
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

Ankur Agarwal
źródło
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.

Kousha
źródło
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.

Mars Robertson
źródło
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'
Steven Penny
źródło
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 [email protected]:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt
Willem van Ketwich
źródło
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
panticz
źródło
2

Rozwiązałem w ten sposób:

git archive --remote=ssh://[email protected]/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”

matiasmasca
źródło
2

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

wget https://github.com/name/folder/file.zip?raw=true
ihsinme
źródło
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.

naught101
źródło
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.

malajisi
źródło
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
Shayki Abramczyk
źródło
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.

JasonS
źródło
0

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

Fernanda Martins
źródło
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

ingconti
źródło
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
}
Christopher Shroba
źródło
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}"
Oliver Pearmain
źródło
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

Granitozaur
źródło
-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.

Hector Llorens
źródło