Отримайте один файл із сховища


221

Який найефективніший механізм (стосовно переданих даних та використовуваного дискового простору) для отримання вмісту одного файлу з віддаленого сховища git?

Поки мені вдалося придумати:

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

Це все ще здається непосильним.

Як щодо отримання декількох файлів з репо?


3
Aaw Мені б сподобалося, якби було вбудовано так, щоб зробити еквівалент "кіт-віддалений" та "тег-віддалений".
conny

3
У мене є ця сама проблема, я хочу мати той самий файл ліцензії у двох репортажах; відредагуйте файл в 1 репо, тоді він автоматично оновить копію в іншій репо.
GlassGhost

Відповіді:


144

у git версії 1.7.9.5 це, здається, працює для експорту одного файлу з віддаленого пристрою

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

Це визначить вміст файлу README.md.


27
... За винятком того, що він не працює на GitHub. Данг. :( twitter.com/GitHubHelp/status/322818593748303873
Роб Говард

13
Здається, це не дає вихідного файлу, а скоріше файл tar з лише одним файлом.
Фріріх Раабе

20
@FrerichRaabe просто додати `| tar -x` до команди. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
renier

12
Ви можете використовувати tar -xOдля виводу STDOUT для трубопроводів, наприкладFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
Точно відповідь я шукав, але отримую "фатальний: Операція не підтримується протоколом". у відповідь від Git. Арг.
mhvelplund

68

Слідом за Якуб «s відповідь . git archiveстворює тар або 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 archive --remoteрепозиторіях Git, розміщених git-daemon, вам потрібно включити параметр config daemon.uploadarch. Дивіться https://kernel.org/pub/software/scm/git/docs/git-daemon.html


2
Якщо це текстовий файл, і ми хочемо зберегти його в іншій частині, це використовувати gut: | tar -xO> ~ / destfile.ext
yucer

44

Якщо є розгорнутий веб-інтерфейс (наприклад, gitweb, cgit, Gitorious, ginatra), ви можете використовувати його для завантаження одного файлу ("raw" або "plain").

Якщо інша сторона його включила , ви можете скористатися параметром git archive 's' --remote=<URL>'(і, можливо, обмежити його до каталогу, в якому знаходиться файл, який знаходиться у), наприклад:

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

Примітка: приклад не перевірявся!
Якуб Нарубський

7
Для власних репозиторіїв потрібно спеціально включити архів завантаження, якщо ви використовуєте git-daemon (git: // style urls) з git config daemon.uploadarch trueу віддаленому сховищі. За замовчуванням демон git відключає віддалений архів із "фатальним: віддалена помилка: доступ заборонено або сховище не експортовано: ..."
patthoyts

+1 git archiveПідхід був моєю першою спробою - але тоді я помітив, що вимога tarна клієнтській машині не зовсім зручна для користувачів Windows. Ми закінчилися з нашого локального cgitсервера. Це працює, але це не так швидко, як хотілося б, щоб це було (і це все ще вимагає запуску unix2dosабо подібності на машинах Windows, оскільки ми зберігаємо файли з закінченнями рядків Unix у сховищі Git).
Фріріх Раабе

1
@FrerichRaabe Використовуйте -o fetched.zip. Також дивіться параметр --format = <fmt>.
акхан

5
Що варто, це не виглядає так, як це працює на сховищах GitHub. Дивіться help.github.com/articles/can-i-archive-a-repository and groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

Загалом, але якщо ви використовуєте Github:

Для мене wgetсировина URL виявилася найкращим і найпростішим способом завантажити один конкретний файл.

Відкрийте файл у браузері і натисніть на кнопку «Сире». Тепер оновіть веб-переглядач, скопіюйте 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

Приклад wget не працює, хоча приклад curl не працює.
Кайл Бейкер

Для мене працює чудово. Ви помістили свій URL в лапки в командному рядку?
Анкур Агарвал

це не зберігає історію 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

де 4означає чотири редакції з цього моменту і ~є тильдом, як згадується в коментарі.


Не забудьте помітити, що це НЕ знак мінус '' - 'між' HEAD 'і' 4 ', а' tilde '' ~ '. Мабуть, я недостатньо добре прочитав документи git, або мої окуляри потребують оновлення ;-)
Dennis

18
Схоже, цей файл не отримує файл із віддаленого сховища, як це потрібно для ОП.
Майк Веллер

Або: git show HEAD:./my_other_file > local_fileякщо файл не знаходиться у вашому кореневому режимі :)
kenorb

1
Добрий запит для всіх похідних - будь ласка, поясніть та уточніть, що не в порядку - ми тут, щоб вивчити та поділитися :)
Mars Robertson

9
@MichalStefanow: Майк Веллер має його; конкретно, це не працює у віддаленому сховищі. Вам потрібен локальний клон як мінімум, навіть якщо тоді на ньому встановлені пульти.
Роб Говард

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
Adobe

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
Це працює лише для публічних сховищ. Для приватних сховищ потрібна автентифікація.
Рікардо Отеро

5

Нюансований варіант деяких відповідей тут, що відповідає на питання ОП:

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-архів.
Філіп Фленкер

2
Err .. git використовується більше ніж просто GitHub
Віллем ван Кетвіч

1
Ви чітко встановили - перейдіть до URL-адреси github у своїй відповіді ;-)
Philipp Flenker

1
Дякуємо за відгук. Відповідно змінили відповідь.
Віллем ван Кетвіч

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

Відповідь Ісраель Дов прямозначна , але не дозволяє стиснути. Ви можете використовувати --format=zip, але ви не можете безпосередньо розпакувати цю команду pipe, як ви можете з 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. введіть тут опис зображення

Потім браузер відкриє нову сторінку з URL-адресою, починаючи з https://raw.githubusercontent.com/ ...

просто введіть команду в термінал:

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

Деякий час файл буде розміщений у вашій папці.


Так, це також добре працює в Python або інших мовах програмування, з REST-функціональністю. Наприклад для завантаження модулів з різних сховищ ..
Lars GJ

1

Якщо ваш Git сховище розміщено на Azure-DevOps (VSTS), ви можете отримати один файл за допомогою 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, чи не так?
Юрій Позняк

Залежить, як ви запускаєте api
Shayki Abramczyk

0

Я використовую curl, він працює з загальнодоступними репозиторами або з тими, хто використовує 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-клон, і як тільки репозиторій буде клонований, ви повинні використовувати git-архів, щоб він працював.

Я розміщую питання про те, як зробити це простіше в архіві git з певного хеша з віддаленого


0

для бітбукета безпосередньо з браузера (я використовував сафарі ...) клацніть правою кнопкою миші на "Переглянути сировину" та виберіть "Завантажити пов'язаний файл":

введіть тут опис зображення


0

Якщо ви не заперечуєте проти клонування всього каталогу, ця невелика функція 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
}

Ця відповідь може допомогти зробити рідкий клон, тобто без накладних витрат.
Юрій Позняк

0

Рішення 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}"

Де ми знаходимо GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling

1
Ви можете створити персональний маркер доступу, перейшовши на сторінку https: // <your-github-server> / settings / tokens та натиснувши кнопку "Створити новий маркер".
Олівер Пірмен

Хм, у нас є автоматизації, яким надають ім’я користувача та пароль, які використовуються для автентифікації для декількох систем, які використовують один і той же 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, вам потрібно - no-check-сертифікат, як сказав @Kos. Я вважаю за краще це, а не змінювати .wgetrc, але це залежить від ваших потреб.

Якщо це великий файл, ви можете розглянути можливість використання -c з wget. Щоб мати змогу продовжувати завантаження файлу звідки ви його залишили, якщо попередній намір провалився посередині.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.