リポジトリから単一のファイルを取得する


220

リモートのgitリポジトリから単一のファイルのコンテンツを取得するための(転送されるデータと使用されるディスク領域に関して)最も効率的なメカニズムは何ですか?

これまでのところ、私はなんとか思いついた:

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

これはまだやり過ぎのようです。

リポジトリから複数のファイルを取得するのはどうですか?


3
ああ。「cat-remote」と「tag-remote」に相当する組み込みの方法があれば、私はそれが好きです。
10

3
これと同じ問題がありますが、2つのリポジトリに同じライセンスファイルが必要です。1つのリポジトリでファイルを編集してから、他のリポジトリのコピーを自動更新します。
GlassGhost

回答:


143

gitバージョン1.7.9.5では、これはリモートから単一のファイルをエクスポートするように機能するようです

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

これにより、ファイルの内容がcatされますREADME.md


27
... GitHubでは機能しません。ダン。:( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard

13
これは、生のファイルを生成するようには見えませんが、単一のファイルのみを含むtarファイルを生成するようです。
Frerich Raabe 2014

20
@FrerichRaabeは単に `|を追加します tar -x`をコマンドに追加します。 git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
2015年

12
を使用tar -xOして、配管用にSTDOUTに出力できます。例:FILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
まさに私が探していた答えですが、「致命的:操作はプロトコルでサポートされていません」と表示されます。Gitからの応答。ああ。
mhvelplund 2016

68

ヤクブ答えに続きますgit archivetarまたはzipアーカイブを生成するため、ファイルのコンテンツを取得するには、出力をtarにパイプする必要があります。

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

リモートリポジトリのHEADから 'filename'のコピーを現在のディレクトリに保存します。

:path/to/directory一部はオプションです。除外した場合、取得したファイルは次の場所に保存されます<current working dir>/path/to/directory/filename

さらに、git archive --remotegit-daemonがホストするGitリポジトリでの使用を有効にする場合は、daemon.uploadarch構成オプションを有効にする必要があります。https://kernel.org/pub/software/scm/git/docs/git-daemon.htmlを参照してください


2
それがテキストファイルであり、別の部分に保存したい場合は、次のように使用します。tar -xO>〜/ destfile.ext
yucer

44

もしあるなら 、Webインターフェイス(gitwebのように、CGIT、Gitorious、ginatra)展開は、あなたが(「生」または「平野」ビュー)1つのファイルをダウンロードするためにそれを使用することができます。

反対側で有効にした場合は、gitアーカイブの ' --remote=<URL>'オプションを使用できます(ファイルが存在するディレクトリに限定することもできます)。次に例を示します。

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

注:この例はテストされていません!
JakubNarębski、2009

7
自分のリポジトリgit config daemon.uploadarch trueで、リモートリポジトリでgit-daemon(git://スタイルのURL)を使用する場合は、特にアップロードアーカイブを有効にする必要があります。デフォルトでは、gitデーモンは「致命的:リモートエラー:アクセスが拒否されたか、リポジトリがエクスポートされていません:...」でリモートアーカイブを無効にします
patthoyts

+1このgit archiveアプローチは私の最初の試みでしたが、その後tar、クライアントマシン上での要求はWindowsユーザーにとって正確ではないことに気付きました。ローカルcgitサーバーからフェッチしました。動作しますが、思ったほど高速ではありません(unix2dosUnixの行末を持つファイルをGitリポジトリに保存するため、Windowsマシンで実行するか、同様に実行する必要があります)。
Frerich Raabe 14年

1
@FrerichRaabe -o fetched.zipを使用します。--format = <fmt>オプションも参照してください。
アカーン、2014年

5
価値があるのは、これがGitHubがホストするリポジトリで機能するようには見えないことです。help.github.com/articles/can-i-archive-a-repositorygroups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

一般的ではありませんが、Githubを使用している場合:

私にとってwget、未加工のURLは、特定のファイルをダウンロードするための最良かつ最も簡単な方法であることがわかりました。

ブラウザでファイルを開き、「Raw」ボタンをクリックします。次に、ブラウザーを更新し、URLをコピーして、wgetそれcurlを実行します。

wgetの例:

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

カールの例:

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


3
これは最も簡単なソリューションであり、見つけることができるあらゆる生のtxtに対して機能します。 curl https://example.com/raw.txt > savedFile.txt
JacobPariseau 2017年

wgetの例は機能しませんが、curlの例は機能します。
カイルベイカー

私にとってはうまくいきます。コマンドラインでURLを引用符で囲みましたか?
Ankur Agarwal 2017

これはgitの履歴を保存しません
crypdick

15

リモートから単一のファイルをエクスポートするには:

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

ファイルがダウンロードされます README.mdが現在のディレクトリにれます。

ファイルの内容をSTDOUTにエクスポートする場合:

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

コマンドの最後に複数のパスを指定できます。


9

それは私にとって解決策のようです:http//gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

where 4は今から4つのリビジョンを意味~し、コメントで言及されているチルダです。


これは、「HEAD」と「4」の間の「マイナス記号」「-」ではなく、「チルダ」「〜」であることを確認してください。どうやら私はgitドキュメントを十分に読んでいないか、眼鏡を更新する必要があります;-)
Dennis

18
OPが必要とするように、これはリモートリポジトリからファイルを取得しないようです。
マイクウェラー2013年

または:git show HEAD:./my_other_file > local_fileファイルがルートディレクトリにない場合:)
kenorb 2013年

1
すべての反対投票者への親切な要求-良くないことを説明して明確にしてください-私たちはここで学び、共有します:)
Mars Robertson

9
@MichalStefanow:Mike Wellerが持っています。具体的には、これはリモートリポジトリでは機能しません。リモートがセットアップされていても、少なくともローカルクローンが必要です。
Rob Howard

6

私はこれを使います

$ 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の調整なしで私の作品:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
アドビ

1
私のメッセージはより役に立ちます: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'.
コスヤン

3
これは、パブリックリポジトリでのみ機能します。プライベートリポジトリの場合、認証が必要です。
Ricardo Otero 2015年

5

OPの質問に答える、いくつかの回答の微妙なバリエーション:

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

これは機能しません。githubはgitアーカイブをサポートしていません。
Philipp Flenker、2018

2
エラー
。GitHub

1
あなたは明示的に--remoteをgithub URLに回答で明示的に設定しました;-)
Philipp Flenker '14

1
フィードバックをお寄せいただきありがとうございます。それに応じて回答を修正しました。
Willem van Ketwich、2018

2

リポジトリがトークン(GitLabなど)をサポートしている場合は、ユーザーのトークンを生成してから、ダウンロードするファイルに移動し、RAW出力をクリックしてURLを取得します。ファイルをダウンロードするには:

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

2

私はこのように解決しました:

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

必要に応じて、「BranchName」を「HEAD」に置き換えることができます


2

私には次のものを使用する最も簡単な方法のようです:

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

1

Yisrael Dovの答えは簡単ですが、圧縮はできません。を使用することはでき--format=zipますが、tarのようにパイプコマンドで直接解凍することはできないため、一時ファイルとして保存する必要があります。スクリプトは次のとおりです。

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

これはディレクトリでも機能します。


1

単一ファイルの場合は、wgetコマンドを使用します。

最初に、下の画像に従って「raw」をクリックしてURLを取得します。そうしないと、HTMLに埋め込まれたコードがダウンロードされます。 ここに画像の説明を入力してください

次に、ブラウザーはhttps://raw.githubusercontent.com/で始まるURLで新しいページを開きます。 ...

ターミナルでコマンドを入力するだけです:

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

しばらくすると、ファイルがフォルダに配置されます。


そう、これはPythonや他のプログラミング言語内でもREST機能でうまく機能します。たとえば、さまざまなリポジトリからモジュールをダウンロードする場合..
Lars GJ

1

GitリポジトリがAzure-DevOps(VSTS)でホストされている場合は、Rest APIを使用して単一のファイルを取得できます。

このAPIの形式は次のようになります。

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

例えば:

 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トークンが必要ですよね。
Yuriy Pozniak

APIの実行方法に依存
Shayki Abramczyk

0

私はcurlを使用します。これはパブリックリポジトリまたはWebインターフェイス経由のhttps基本認証を使用するリポジトリで動作します。

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

私はgithubとbitbucketでテストしましたが、両方で動作します。


0

特定のハッシュ+リモートリポジトリからファイルを取得したい場合は、git-archiveを試してみましたが、機能しませんでした。

git cloneを使用する必要があり、リポジトリが複製されたら、git-archiveを使用して機能させる必要があります。

リモートからの特定のハッシュからgitアーカイブでそれをより簡単にする方法についての質問を投稿します


0

ブラウザから直接bitbucketの場合(私はsafariを使用しました...)[Rawを表示]を右クリックして[リンクファイルのダウンロード]を選択します。

ここに画像の説明を入力してください


0

ディレクトリ全体を複製してもかまわない場合は、この小さなbash / zsh関数を使用すると、単一のファイルを現在のディレクトリに複製できます(一時リポジトリにリポジトリを複製し、後で削除することにより)。

プロ:必要なファイルのみを取得します

短所:リポジトリ全体が複製されるのを待つ必要があります

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
}

この答えは、オーバーヘッドのないスパースクローンを作成するのに役立ちます。
Yuriy Pozniak

0

Githubエンタープライズソリューション

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

どこにありますGITHUB_PERSONAL_ACCESS_TOKENか?
ShadSterling

1
個人用アクセストークンを作成するには、https:// <your-github-server> / settings / tokensに移動し、[Generate new token]ボタンをクリックします。
Oliver Pearmain

ユーザー名とパスワードが指定された自動化があり、同じSSOを使用する複数のシステムの認証に使用されるため、ユーザー名とパスワードを指定してトークンを自動生成する方法を望んでいました。
ShadSterling

0

あなたの目標がファイルをダウンロードすることだけであるならば、呼ばれる手間のかからないアプリケーションがありますgget

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

上記の例では、hugoリポジトリから単一のファイルをダウンロードします。

https://github.com/dpb587/gget


-1

@Steven Pennyの回答に関連して、私はwgetも使用しています。さらに、出力を送信するファイルを決定するには、-Oを使用します。

gitlabsを使用している場合、URLの別の可能性は次のとおりです。

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

証明書を持っている場合、またはgitlabsインストール用の信頼できるサーバーからアクセスしない限り、@ Kosが言ったように--no-check-certificateが必要です。私は.wgetrcを変更するよりもそれを好みますが、それはあなたのニーズによって異なります。

大きなファイルの場合は、wgetで-cオプションを使用することを検討してください。以前のインテントが途中で失敗した場合に、ファイルをダウンロードした場所からダウンロードを続行できるようにするため。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.