Bir depodan tek bir dosya alma


221

Uzak git deposundan tek bir dosyanın içeriğini almak için en etkili mekanizma (aktarılan veri ve kullanılan disk alanı açısından) nedir?

Şimdiye kadar gelmeyi başardım:

git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

Bu hala aşırıya kaçmış gibi görünüyor.

Depodan birden fazla dosya almaya ne dersiniz?


3
AAW. "Cat-remote" ve "tag-remote" eşdeğerini yapmak için yerleşik bir yol olsaydı çok isterdim.
conny

3
Ben 2 aynı depoda aynı lisans dosyasına sahip olmak istiyorum aynı sorunu var; dosyayı 1 repoda düzenleyin ve ardından diğer repodaki kopyayı otomatik olarak güncelleyin.
GlassGhost

Yanıtlar:


144

git 1.7.9.5 sürümünde bu uzaktan kumandadan tek bir dosyayı vermek için çalışıyor gibi görünüyor

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

Bu dosyanın içeriğini toplar README.md.


27
... ancak GitHub'da çalışmaz. Dang. :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard

13
Bu ham dosyayı değil, sadece tek bir dosya içeren bir tar dosyasını verir.
Frerich Raabe

20
@FrerichRaabe sadece ekle | tar -x` komutunu girin. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
renier

12
tar -xOBoru tesisatı için STDOUT çıktısını kullanabilirsiniz , örneğinFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
Tam olarak aradığım cevap, ancak "ölümcül: İşlem protokol tarafından desteklenmiyor" alıyorum. Git yanıtını verdi. Ahh.
mhvelplund

68

İtibaren ardından Jakub 'ın cevabı . git archivebir zift veya zip arşivi oluşturur, bu nedenle dosya içeriğini almak için çıktıyı zift üzerinden geçirmeniz gerekir:

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

'Dosya adının' bir kopyasını geçerli dizindeki uzak deponun HEAD'ından kaydeder.

:path/to/directoryBölüm isteğe bağlıdır. Dışarıda bırakılırsa, getirilen dosya şuraya kaydedilir:<current working dir>/path/to/directory/filename

Ayrıca, git archive --remotegit-daemon tarafından barındırılan Git depolarının kullanımını etkinleştirmek istiyorsanız , daemon.uploadarch yapılandırma seçeneğini etkinleştirmeniz gerekir. Bkz. Https://kernel.org/pub/software/scm/git/docs/git-daemon.html


2
Bir metin dosyası ve başka bir bölüme kaydetmek istiyorsanız, kullanmak için bağırsak: | tar -xO> ~ / destfile.ext
yucer

44

Dağıtılmış web arayüzü varsa (gitweb, cgit, Gitorious, ginatra gibi), tek dosyayı ('ham' veya 'düz' görünüm) indirmek için kullanabilirsiniz.

Diğer taraf etkinleştirdiyse , git arşiv 's' --remote=<URL>'seçeneğini kullanabilir (ve muhtemelen dosyanın bulunduğu bir diziyle sınırlayabilirsiniz), örneğin:

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

Not: örnek test edilmemiştir!
Jakub Narębski

7
Kendi depolarınız git config daemon.uploadarch trueiçin, uzak depoda git-daemon (git: // stil urls) kullanıyorsanız, upload-arşivini özellikle etkinleştirmeniz gerekir . Git daemon varsayılan olarak "
artik

+1 git archiveYaklaşım ilk denememdi - ancak taristemci makineye ihtiyaç duymanın Windows kullanıcıları için tam olarak uygun olmadığını fark ettim . Yerel cgitsunucumuzdan getirdik . Çalışıyor, ancak olmasını istediğim kadar hızlı değil (ve unix2dosUnix satır sonlarına sahip dosyaları Git deposunda depoladığımız için Windows makinelerinde hala çalışmayı veya benzerliği gerektiriyor ).
Frerich Raabe

1
@FrerichRaabe -o fetched.zip kullanın. Ayrıca bkz. --Format = <fmt> seçeneği.
akhan

5
Değeri ne olursa olsun, GitHub tarafından barındırılan depolarda işe yaramaz gibi görünmüyor. Bkz help.github.com/articles/can-i-archive-a-repository ve groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

Genel olarak değil ama Github kullanıyorsanız:

Benim için wget için ham url belirli bir dosyayı indirmek için en iyi ve en kolay yol olduğu ortaya çıktı.

Dosyayı tarayıcıda açın ve "Raw" düğmesine tıklayın. Şimdi tarayıcınızı yenileyin, URL'yi kopyalayın ve bir wgetveyacurl üzerinde yapın.

wget örneği:

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

Kıvırmak örneği:

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


3
Bu en kolay çözümdür ve bulabileceği herhangi bir ham txt için çalışır. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau

wget örneği çalışmıyor, curl örneği de çalışıyor.
Kyle Baker

Benim için iyi çalışıyor. URL'nizi komut satırında tırnak içine aldınız mı?
Ankur Agarwal

bu git geçmişini
korumaz

15

Uzaktan kumandadaki tek bir dosyayı dışa aktarmak için:

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

Bu dosyayı indirir README.md geçerli dizininize .

Dosyanın içeriğinin STDOUT'a dışa aktarılmasını istiyorsanız:

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

Komutun sonunda birden çok yol sağlayabilirsiniz.


9

Bana bir çözüm gibi görünüyor: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

burada 4dört düzeltme demek ve ~yorumda belirtildiği gibi bir tilde.


'HEAD' ve '4' arasındaki 'eksi işareti' '-' DEĞİL, ancak 'tilde' '~' olduğunu fark ettiğinizden emin olun. Görünüşe göre git belgeleri yeterince iyi okumadım, ya da gözlüklerimin güncellenmesi gerekiyor ;-)
Dennis

18
Bu, OP'nin ihtiyaç duyduğu gibi, dosyayı uzak bir depodan almıyor gibi görünüyor.
Mike Weller

Veya: git show HEAD:./my_other_file > local_filedosya kök
dizininizde değilse

1
Tüm downvoters için nazik istek - Lütfen neyin iyi olmadığını açıklayın ve açıklayın - öğrenmek ve paylaşmak için buradayız :)
Mars Robertson

9
@MichalStefanow: Mike Weller var; özellikle, bu uzak bir depoda çalışmaz. Daha sonra üzerinde uzaktan kumandalar olsa bile, en azından yerel bir klon gerekir.
Rob Howard

6

Bunu kullanıyorum

$ 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'

Wgetrc tweaks olmadan bile benim için çalışıyor:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe

1
Mesajım daha faydalı: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
Bu yalnızca halka açık depolar için geçerlidir. Özel depolar için kimlik doğrulamasına ihtiyacınız vardır.
Ricardo Otero

5

OP'nin sorusuna cevap veren bazı cevapların nüanslı bir çeşidi:

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

Bu işe yaramaz, github git arşivini desteklemez.
Philipp Flenker

2
Hata .. git GitHub'dan daha fazlası için kullanılır
Willem van Ketwich

1
Yine de cevabınızda bir github URL'sine --remote ayarladınız ;-)
Philipp Flenker

1
Geri dönüşünüz için teşekkür ederiz. Cevabı buna göre değiştirdik.
Willem van Ketwich

2

Depo destek simgelerini (örneğin GitLab) desteklerseniz, kullanıcı için bir belirteç oluşturursanız, indireceğiniz dosyaya gidin ve URL'yi almak için RAW çıktısını tıklayın. Dosyayı indirmek için şunu kullanın:

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

2

Bu şekilde çözdüm:

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

İsterseniz "HEAD" yerine "BranchName" yazabilirsiniz.


2

Bana öyle geliyor ki aşağıdakileri kullanmanın en kolay yolu:

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

1

Yisrael Dov'un cevabı basittir, ancak sıkıştırmaya izin vermez. Kullanabilirsiniz --format=zip, ancak tar ile olduğu gibi bir boru komutuyla doğrudan açamazsınız, bu yüzden geçici bir dosya olarak kaydetmeniz gerekir. İşte bir senaryo:

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

Bu dizinlerle de çalışır.


1

Tek dosya için sadece wget komutunu kullanın.

İlk olarak, url almak için "ham" tıklayın aşağıdaki resmi izleyin, aksi takdirde html gömülü kod indirecektir. resim açıklamasını buraya girin

Ardından, tarayıcı https://raw.githubusercontent.com/ ile url başlangıcı ile yeni bir sayfa açar. ... .

komutu terminale girin:

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

Bir süre dosya klasörünüze yerleştirilir.


Evet, bu Python veya diğer programlama dillerinde de REST işleviyle iyi çalışıyor. Örneğin, farklı depolardaki modülleri indirmek için ..
Lars GJ

1

Git deponuz Azure-DevOps'ta (VSTS) barındırılıyorsa Rest API'sı ile tek bir dosya alabilirsiniz .

Bu API'nın biçimi şuna benzer:

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

Örneğin:

 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

Api jetonu gerektirir, değil mi?
Yuriy Pozniak


0

Curl kullanıyorum, genel depolarla veya bir web arayüzü üzerinden https temel kimlik doğrulaması kullananlarla çalışır.

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

Ben github ve bitbucket üzerinde test ettik, her ikisi de çalışır.



0

doğrudan tarayıcıdan bitbucket için (I safari kullandım ...) 'Raw Görüntüle'ye sağ tıklayın ve "Bağlantılı Dosyayı İndir" i seçin:

resim açıklamasını buraya girin


0

Tüm dizini klonlamanın sakıncası yoksa, bu küçük bash / zsh işlevinin sonucu, tek bir dosyayı geçerli dizininize klonlamanın sonucudur (repoyu geçici bir dizine klonlayıp daha sonra kaldırarak).

Pro: Sadece istediğiniz dosyayı alıyorsunuz

Con: Hala tüm repo'nun klonlanmasını beklemek zorundasın

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
}

Bu cevap seyrek klon yapmaya yardımcı olabilir.
Yuriy Pozniak

0

Github Kurumsal Çözümü

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}"

Nerede bulabiliriz GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling

1
Https: // <your-github-server> / settings / tokens adresine gidip "Yeni jeton oluştur" düğmesine basarak kişisel erişim jetonu oluşturabilirsiniz.
Oliver Pearmain

Hmm, aynı SSO'yu kullanan birden fazla sistemde kimlik doğrulaması için kullanılan bir kullanıcı adı ve şifre verilen otomasyonlarımız var, bu yüzden bir kullanıcı adı ve şifre verilen bir token oluşturmayı otomatikleştirmenin bir yolunu umuyordum.
ShadSterling


-1

@Steven Penny'nin cevabı ile ilgili olarak ben de wget kullanıyorum. Ayrıca, hangi dosyayı çıktı göndermek için karar -O kullanın.

Gitlabs kullanıyorsanız url için başka bir olasılık:

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

Sertifikanız yoksa veya gitlabs kurulumu için güvenilir bir sunucudan erişmediğiniz sürece, @Kos'un dediği gibi no-check-certificate gerekir. Bunu .wgetrc'yi değiştirmek yerine tercih ederim ama bu sizin ihtiyaçlarınıza bağlıdır.

Büyük bir dosyaysa, wget ile -c seçeneğini kullanmayı düşünebilirsiniz. Önceki amaç ortada başarısız olursa dosyayı kaldığınız yerden indirmeye devam edebilmek için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.