Ambil satu file dari repositori

220

Apa mekanisme yang paling efisien (berkenaan dengan data yang ditransfer dan ruang disk yang digunakan) untuk mendapatkan isi dari satu file dari repositori git jarak jauh?

Sejauh ini saya sudah berhasil menemukan:

git clone --no-checkout --depth 1 [email protected]:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

Ini masih terlihat berlebihan.

Bagaimana dengan mendapatkan beberapa file dari repo?

dreftymac
sumber
3
Aaw. Saya akan senang jika ada cara yang dibangun untuk melakukan yang setara dengan "cat-remote" dan "tag-remote".
conny
3
Saya memiliki masalah yang sama, saya ingin memiliki file lisensi yang sama dalam 2 repo; edit file dalam 1 repo kemudian minta perbarui salinan secara otomatis dalam repo lainnya.
GlassGhost
Kemungkinan rangkap dari Bagaimana cara checkout hanya satu file dari repositori git?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

143

di git versi 1.7.9.5 ini tampaknya berfungsi untuk mengekspor satu file dari jarak jauh

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

Ini akan menjadi cat dari isi file README.md.

Yisrael Dov
sumber
27
... Kecuali itu tidak berfungsi di GitHub. Dang. :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard
13
Ini sepertinya tidak menghasilkan file mentah melainkan file tar dengan hanya satu file.
Frerich Raabe
20
@FrerichRaabe cukup tambahkan `| tar -x` ke perintah. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
renier
12
Anda dapat menggunakan tar -xOuntuk output ke STDOUT untuk pemipaan, misalnyaFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm
2
Tepat jawaban yang saya cari, tetapi saya mendapatkan "fatal: Operasi tidak didukung oleh protokol." sebagai tanggapan dari Git. Argh.
mhvelplund
68

Sebagai lanjutan dari jawaban Jakub . git archivemenghasilkan tar atau arsip zip, jadi Anda perlu menyalurkan output melalui tar untuk mendapatkan konten file:

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

Akan menyimpan salinan 'nama file' dari HEAD repositori jarak jauh di direktori saat ini.

Bagian :path/to/directoryini opsional. Jika dikecualikan, file yang diambil akan disimpan ke<current working dir>/path/to/directory/filename

Selain itu, jika Anda ingin mengaktifkan penggunaan git archive --remoterepositori on Git yang di-host oleh git-daemon, Anda perlu mengaktifkan opsi konfigurasi daemon.uploadarch. Lihat https://kernel.org/pub/software/scm/git/docs/git-daemon.html

Robert Knight
sumber
2
Jika itu adalah file teks dan kami ingin menyimpannya ke bagian lain, maka ia harus menggunakan: | tar -xO> ~ / destfile.ext
yucer
44

Jika ada antarmuka web digunakan (seperti gitweb, cgit, Gitorious, ginatra), Anda dapat menggunakannya untuk mengunduh file tunggal (tampilan 'mentah' atau 'polos').

Jika pihak lain mengaktifkannya , Anda dapat menggunakan opsi 's' ' arsip git--remote=<URL> (dan mungkin membatasinya ke direktori yang diberikan file berada di), misalnya:

$ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -
Jakub Narębski
sumber
Catatan: contoh tidak diuji!
Jakub Narębski
7
Untuk repositori Anda sendiri, Anda perlu mengaktifkan arsip unggahan secara khusus jika menggunakan git-daemon (git: // url gaya) dengan git config daemon.uploadarch truepada repositori jarak jauh. Secara default git daemon menonaktifkan arsip jarak jauh dengan "fatal: remote error: akses ditolak atau repositori tidak diekspor: ..."
patthoyts
+1 git archivePendekatan ini adalah percobaan pertama saya - tetapi kemudian saya perhatikan bahwa mewajibkan tarmesin klien tidak nyaman bagi pengguna Windows. Kami akhirnya mengambil dari cgitserver lokal kami . Ini berfungsi, tetapi tidak secepat yang saya inginkan (dan masih membutuhkan menjalankan unix2dosatau serupa pada mesin Windows karena kita menyimpan file dengan akhiran baris Unix di repositori Git).
Frerich Raabe
1
@FrerichRaabe Gunakan -o fetched.zip. Lihat juga opsi --format = <fmt>.
akhan
5
Untuk apa nilainya, sepertinya ini tidak berfungsi di repositori yang di-host GitHub. Lihat help.github.com/articles/can-i-archive-a-repository and groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob
30

Tidak secara umum tetapi jika Anda menggunakan Github:

Bagi saya wgeturl mentah ternyata menjadi cara terbaik dan termudah untuk mengunduh satu file tertentu.

Buka file di browser dan klik tombol "Raw". Sekarang segarkan browser Anda, salin url dan lakukan wgetatau curldi atasnya.

wget contoh:

wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py

Contoh ikal:

curl 'https://example.com/raw.txt' > savedFile.txt

Ankur Agarwal
sumber
3
Ini adalah solusi termudah, dan berfungsi untuk semua txt mentah yang bisa ditemukan. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau
contoh wget tidak bekerja, contoh ikal tidak.
Kyle Baker
Bekerja dengan baik untuk saya. Apakah Anda memasukkan url Anda di tanda kutip di baris perintah?
Ankur Agarwal
ini tidak menyimpan sejarah git
crypdick
15

Untuk mengekspor satu file dari jarak jauh:

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

Ini akan mengunduh file README.mdke direktori Anda saat ini.

Jika Anda ingin konten file diekspor ke STDOUT:

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

Anda dapat memberikan banyak jalur di akhir perintah.

Kousha
sumber
9

Sepertinya solusi bagi saya: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

di mana 4berarti empat revisi dari sekarang dan ~merupakan tilde sebagaimana disebutkan dalam komentar.

Mars Robertson
sumber
Pastikan untuk memperhatikan bahwa BUKAN 'tanda minus' '-' antara 'HEAD' dan '4', tetapi 'tilde' '~'. Rupanya saya belum membaca dokumen git dengan cukup baik, atau kacamata saya perlu diperbarui ;-)
Dennis
18
Ini tampaknya tidak mendapatkan file dari repositori jarak jauh, seperti kebutuhan OP.
Mike Weller
Atau: git show HEAD:./my_other_file > local_filejika file tersebut tidak berada di direktori root Anda :)
kenorb
1
Permintaan baik untuk semua downvoters - tolong jelaskan dan klarifikasi apa yang tidak beres - kami di sini untuk belajar dan berbagi :)
Mars Robertson
9
@MichalStefanow: Mike Weller memilikinya; khususnya, ini tidak berfungsi pada repositori jarak jauh. Anda memerlukan paling tidak klon lokal, bahkan jika Anda kemudian memiliki remote diatur di atasnya.
Rob Howard
6

Saya menggunakan ini

$ 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
sumber
Bekerja untuk saya bahkan tanpa tweak wgetrc:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe
1
Pesan saya lebih membantu: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
Ini hanya berfungsi untuk repositori publik. Untuk repositori pribadi, Anda perlu otentikasi.
Ricardo Otero
5

Varian bernuansa dari beberapa jawaban di sini yang menjawab pertanyaan OP:

git archive [email protected]:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt
Willem van Ketwich
sumber
Ini tidak berfungsi, github tidak mendukung arsip git.
Philipp Flenker
2
Err .. git digunakan untuk lebih dari sekedar GitHub
Willem van Ketwich
1
Anda secara eksplisit mengatur --mengangkat ke URL github dalam jawaban Anda ;-)
Philipp Flenker
1
Terima kasih untuk umpan baliknya. Telah mengubah jawaban sesuai dengan itu.
Willem van Ketwich
2

Jika repositori Anda mendukung token (misalnya GitLab) kemudian buat token untuk pengguna Anda lalu navigasikan ke file yang akan Anda unduh dan klik pada output RAW untuk mendapatkan URL. Untuk mengunduh file gunakan:

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

Saya memecahkan dengan cara ini:

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

Jika mau, Anda bisa mengganti "BranchName" dengan "HEAD"

matiasmasca
sumber
2

Menurut saya cara termudah untuk menggunakan yang berikut:

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

Jawaban Yisrael Dov adalah yang langsung, tetapi tidak memungkinkan kompresi. Anda dapat menggunakan --format=zip, tetapi Anda tidak dapat secara langsung unzip dengan perintah pipa seperti yang Anda bisa dengan tar, jadi Anda harus menyimpannya sebagai file sementara. Ini skripnya:

#!/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

Ini berfungsi dengan direktori juga.

tidak ada apa-apa101
sumber
1

Untuk file tunggal, cukup gunakan perintah wget.

Pertama, ikuti gambar di bawah ini untuk mengklik "mentah" untuk mendapatkan url, jika tidak Anda akan mengunduh kode yang tertanam dalam html. masukkan deskripsi gambar di sini

Kemudian, browser akan membuka halaman baru dengan url mulai dengan https://raw.githubusercontent.com/ ...

cukup masukkan perintah di terminal:

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

Beberapa saat file akan dimasukkan ke folder Anda.

malajisi
sumber
Yap, ini juga berfungsi dengan baik dalam Python, atau bahasa pemrograman lain, dengan fungsi REST. Misalnya untuk mengunduh modul dari repositori berbeda ..
Lars GJ
1

Jika repositori Git Anda di-host di Azure-DevOps (VSTS), Anda dapat mengambil satu file dengan Rest API .

Format API ini terlihat seperti ini:

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

Sebagai contoh:

 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
sumber
Itu membutuhkan token api, bukan?
Yuriy Pozniak
Tergantung bagaimana Anda menjalankan api
Shayki Abramczyk
0

Saya menggunakan curl, ini bekerja dengan repo publik atau yang menggunakan https otentikasi dasar melalui antarmuka web.

curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD

Saya sudah mengujinya di github dan bitbucket, berfungsi pada keduanya.

JasonS
sumber
0

Jika Anda ingin mendapatkan file dari hash tertentu + repositori jarak jauh, saya sudah mencoba git-arsip dan tidak berhasil.

Anda harus menggunakan git clone dan begitu repositori dikloning, Anda harus menggunakan git-arsip untuk membuatnya bekerja.

Saya memposting pertanyaan tentang bagaimana melakukannya dengan lebih mudah di arsip git dari hash tertentu dari jarak jauh

Fernanda Martins
sumber
0

untuk bitbucket langsung dari browser (saya menggunakan safari ...) klik kanan pada 'View Raw "dan pilih" Unduh Linked File ":

masukkan deskripsi gambar di sini

ingconti
sumber
0

Jika Anda tidak keberatan mengkloning seluruh direktori, fungsi bash / zsh kecil ini akan memiliki hasil akhir dari mengkloning satu file ke direktori Anda saat ini (dengan mengkloning repo ke direktori temp dan menghapusnya setelah itu).

Pro: Anda hanya mendapatkan file yang Anda inginkan

Con: Anda masih harus menunggu seluruh repo untuk dikloning

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
sumber
Jawaban ini dapat membantu membuat klon jarang, yang tanpa overhead.
Yuriy Pozniak
0

Solusi 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
sumber
Di mana kita menemukan GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling
1
Anda dapat membuat token akses pribadi dengan membuka https: // <your-github-server> / settings / token dan menekan tombol "Hasilkan token baru".
Oliver Pearmain
Hmm, kami memiliki otomatisasi yang diberi nama pengguna dan kata sandi, yang digunakan untuk mengautentikasi ke beberapa sistem yang menggunakan SSO yang sama, jadi saya berharap cara mengotomatiskan pembuatan token yang diberikan nama pengguna & kata sandi.
ShadSterling
0

Jika tujuan Anda hanya untuk mengunduh file, ada aplikasi tanpa kerumitan bernama gget:

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

Contoh di atas akan mengunduh satu file dari hugorepositori.

https://github.com/dpb587/gget

Granitosaurus
sumber
-1

Terkait dengan jawaban @Steven Penny, saya juga menggunakan wget. Selanjutnya, untuk memutuskan file mana yang akan dikirim untuk saya gunakan -O.

Jika Anda menggunakan gitlabs, kemungkinan lain untuk url adalah:

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

Kecuali Anda memiliki sertifikat atau Anda mengakses dari server tepercaya untuk instalasi gitlabs yang Anda butuhkan --tidak-periksa-sertifikat seperti yang dikatakan @Kos. Saya lebih suka itu daripada memodifikasi .wgetrc tetapi itu tergantung pada kebutuhan Anda.

Jika ini file besar, Anda mungkin mempertimbangkan untuk menggunakan opsi -c dengan wget. Agar dapat terus mengunduh file dari tempat Anda meninggalkannya jika maksud sebelumnya gagal di tengah.

Hector Llorens
sumber