リポジトリから単一のファイルを取得する
リモートgitリポジトリから単一のファイルのコンテンツを取得するための最も効率的なメカニズム(転送されるデータと使用されるディスク容量に関して)は何ですか?
これまでのところ、私は何とか思いついた:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
これはまだやり過ぎのようです。
リポジトリから複数のファイルを取得するのはどうですか?
gitバージョン1.7.9.5では、これはリモートから単一のファイルをエクスポートするように機能するようです
git archive --remote=ssh://Host/pathto/repo.git HEAD README.md
これにより、ファイルREADME.md
のコンテンツがcatされます。
Jakub の answer から続きます。 git archive
はtarまたはZipアーカイブを生成するため、出力をtarにパイプしてファイルの内容を取得する必要があります。
git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x
現在のディレクトリにあるリモートリポジトリのHEADから「ファイル名」のコピーを保存します。
:path/to/directory
部分はオプションです。除外された場合、フェッチされたファイルは<current working dir>/path/to/directory/filename
に保存されます
さらに、git-daemonがホストするGitリポジトリーでgit archive --remote
の使用を有効にするには、daemon.uploadarch構成オプションを有効にする必要があります。 https://kernel.org/pub/software/scm/git/docs/git-daemon.html を参照してください
Webインターフェースがデプロイされている場合(gitweb、cgit、Gitorious、ginatraなど)、それを使用して単一のファイル(「raw」または「plain 'ビュー)。
反対側で有効にした場合、git archiveを使用できます'--remote=<URL>
'オプション(および、場合によっては、ファイルが存在するディレクトリに制限する)、たとえば:
$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ | tar xvf -
一般的ではありませんが、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
リモートから単一のファイルをエクスポートするには:
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
コマンドの最後に複数のパスを指定できます。
私には解決策のように見えます: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html
git show HEAD〜4:index.html> local_file
ここで、4
は今から4つのリビジョンを意味し、~
はコメントで述べたチルダです。
私はこれを使用します
$ 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'
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
リポジトリがトークン(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
私はこの方法で解決しました:
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」に置き換えることができます
Yisrael Dov's answer は簡単なものですが、圧縮はできません。 --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
これはディレクトリでも機能します。
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
単一ファイルの場合は、wgetコマンドを使用します。
まず、下の写真に従って「生」をクリックしてURLを取得します。それ以外の場合は、htmlに埋め込まれたコードをダウンロードします。
次に、ブラウザは https://raw.githubusercontent.com/ ...で始まるURLで新しいページを開きます。
ターミナルでコマンドを入力するだけです:
#wget https://raw.githubusercontent.com/...
しばらくすると、ファイルがフォルダーに配置されます。
特定のハッシュ+リモートリポジトリからファイルを取得したい場合、git-archiveを試しましたが、機能しませんでした。
Git cloneを使用する必要があり、リポジトリが複製されたら、git-archiveを使用して動作させる必要があります。
リモートからの特定のハッシュからのgitアーカイブ でより簡単にする方法についての質問を投稿します
ディレクトリ全体を複製することを気にしない場合、この小さなbash/zsh関数は、単一のファイルを現在のディレクトリに複製するという最終結果になります(リポジトリを一時ディレクトリに複製し、後で削除することにより)。
Pro:必要なファイルのみを取得します
欠点:リポジトリ全体が複製されるのをまだ待つ必要があります
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
}
私は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でテストしましたが、両方で動作します。
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}"